分離アプリケーションとSide-by-Sideアセンブリ

**分離アプリケーションとSide-by-Sideアセンブリ** (**Isolated Applications and Side-by-side Assemblies**) とは、Windows XPで導入された複数バージョンのソフトウェアコンポーネントの衝突を避けるための仕組みである。システム上に複数バージョンのコンポーネントを共存させ、アプリケーションごとに適切なバージョンのコンポーネントを選択可能にすることで、DLL地獄の解消を意図している。.NET Frameworkにおけるバージョン管理の仕組みをWindowsネイティブに持ち込んだものという見方もできる。

## 使用例
* コモンコントロール (comctl32.dll) のバージョン6
* Microsoft Visual C++ 2005/2008ランタイムの動的リンクバージョン
* GDI+ (gdiplus.dll)

## 分離アプリケーション
分離アプリケーションとは、後述するアプリケーションマニフェストに自己の使用するコンポーネント（Side-by-Sideアセンブリ）を記述したアプリケーションである。分離アプリケーションの実行時、Win32システムはアプリケーションマニフェストを見て、読み込むべきアセンブリ (DLL/EXE) のバージョンを決定する。アセンブリは自身専用のプライベートアセンブリか、複数のバージョンが共存する共有アセンブリとして存在するため、他のアプリケーションによるアセンブリの追加・削除・更新などの影響を受けずに済む。

## Side-by-Sideアセンブリ
Side-by-Sideアセンブリとは、DLL、ウィンドウクラス、COMサーバ、タイプライブラリ、COMインターフェイスなどの集合をマニフェストに記載したものである。

アセンブリは自身について次のような情報を持ち、これによって区別される。
* 種別 (win32など)
* 名前
* 言語
* プロセッサアーキテクチャ
* バージョン
* 公開キートークン
このうち、少なくとも種別・名前・バージョンが必須である。

アセンブリは、共有アセンブリとプライベートアセンブリに区別される。

### 共有アセンブリ
共有アセンブリは様々なアプリケーションにまたがって用いられるアセンブリであり、WinSxSフォルダーにインストールされる。インストールにはデジタル署名とWindows Installerの使用が求められる。例え同名のファイルでも、異なるアセンブリに属していれば、異なるサブディレクトリに格納され、上書きされることはない。

### プライベートアセンブリ
プライベートアセンブリは共有されることなくアプリケーションが個別に用いるアセンブリである。共有アセンブリと違いインストールの必要がない。アプリケーションの実行ファイルの存在するディレクトリもしくはそのサブディレクトリに配置される。そのため、共有アセンブリを使用しないアプリケーションは、インストーラーを使用せず単純なファイルコピーのみでアプリケーションを使用できる。

通常COMコンポーネントはWindowsシステムレジストリへの事前登録が必要となり、また登録の際には管理者権限を要求するが、SxSプライベートアセンブリの仕組みを利用することでレジストリ登録が不要なCOMコンポーネントを作成・利用することも可能となる。

## マニフェスト
**マニフェスト**は分離アプリケーション、Side-by-Sideアセンブリの双方で自己について記載するXMLファイルであり、拡張子manifestを持つ。分離アプリケーションが用いるものを**アプリケーションマニフェスト**、Side-by-Sideアセンブリが用いるものを**アセンブリマニフェスト**と呼ぶ。

Microsoft Docs（旧MSDNライブラリ）の「Windows XP ビジュアル スタイルの使用」に記載されてあるアプリケーションマニフェストの例を以下に引用する。

```xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="CompanyName.ProductName.YourApp"
    type="win32"
/>
<description>アプリケーションの説明</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>
```

assemblyIdentity要素およびdescription要素では、分離アプリケーション自身の情報について記述する。そして、dependentAssembly要素でこのアプリケーションが参照するSide-by-Sideアセンブリの情報を記載する。assemblyIdentity要素1つがアセンブリ1つに対応する。

アプリケーションマニフェストは、通常、分離アプリケーションの実行時に読み込まれるが、アクティベーションコンテキストAPIを使用することでより細かく制御できる。

なお、分離アプリケーションとSide-by-Sideアセンブリに関する項目のほか、アプリケーションマニフェストには以下の項目も存在する。
* ユーザーアカウント制御に関するもの（Windows Vistaより）。
* 高DPI対応の宣言（Windows Vistaより）。
* Windowsへの互換性表明（Windows 7より）。この機能が搭載されたのはWindows 7からではあるものの、Windows Vistaへの互換を宣言する旨の項目も用意されている。

マニフェストは「実行ファイル名.manifest」という名前で実行ファイルと同じフォルダーに置くか、ビルド時にリソースとして実行ファイルに埋め込むことで機能する。

### 構成ファイル
アセンブリの配布を始めた後に、使用するアセンブリの変更を行うための仕組みである。

例えば、セキュリティ上の問題が発覚した場合、発行者構成ファイルをWinSxSにインストールすると、プライベートアセンブリを使用していた分離アプリケーションでもバージョンが該当すれば、共有アセンブリにインストールされたより新しいバージョンを使用させると言ったことも可能である。

## Side-by-Sideコンポーネント共有
**Side-by-Sideコンポーネント共有**とは、Windows 2000およびWindows 98 Second Editionにおいて導入された、コンポーネントの衝突を避けるための実装技術である。「分離アプリケーションとSide-by-Sideアセンブリ」と同じ目的を持ち、その前身であると言える。

## 脚注

### 注釈

### 出典

## 参考

以下はMSDNライブラリ内
* Windows XP で分離アプリケーションと Side-by-Side アセンブリをビルドし、サービスを提供する方法
* Isolated Applications and Side-by-side Assemblies

## 関連項目
* DLL地獄
* グローバル アセンブリ キャッシュ

## 外部リンク

* Happy SysAdm: Windows 2008 space issue and WinSxS growing fast