分離アプリケーションと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アセンブリとは、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 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コンポーネント共有とは、Windows 2000およびWindows 98 Second Editionにおいて導入された、コンポーネントの衝突を避けるための実装技術である。「分離アプリケーションとSide-by-Sideアセンブリ」と同じ目的を持ち、その前身であると言える。 [脚注の使い方] ^ Visual C++ 2010以降の再頒布可能パッケージは中央配置 (central deployment) 方式に戻っている。すなわち、ランタイムインストーラーによって%WinDir%\System32にmsvcr100.dllなどが配置される。 ^ a b “Windows XP ビジュアル スタイルの使用”. Microsoft Docs. マイクロソフト (2008年12月3日). 2022年1月6日閲覧。 ^ DLL Hellを解消する新しいWindowsインストーラとアセンブリ（7/7） - ＠IT ^ “C/C++ 分離アプリケーションおよび side-by-side アセンブリのビルド”. MSDNライブラリ. マイクロソフト (2007年11月). 2010年3月30日時点のオリジナルよりアーカイブ。2008年11月8日閲覧。 ^ Concepts of Isolated Applications and Side-by-side Assemblies | Microsoft Docs ^ “Assembly Manifests” (英語). MSDNライブラリ. マイクロソフト (2007年11月1日). 2008年11月8日閲覧。 ^ “Installing Side-by-side Assemblies as Shared Assemblies” (英語). MSDNライブラリ. マイクロソフト (2007年11月1日). 2008年11月8日閲覧。 ^ Creating Registration-Free COM Objects - Win32 apps | Microsoft Docs ^ “Step 6: Create and Embed an Application Manifest (UAC)”. MSDNライブラリ. マイクロソフト. 2008年11月8日閲覧。 ^ “高 DPI 対応の Win32 アプリケーションを記述する”. Windows 7 ホワイト ペーパー. マイクロソフト (2009年4月28日). 2010年12月29日閲覧。 ^ “Application Manifest - Win32 apps” (英語). Microsoft Docs. マイクロソフト (2021年4月28日). 2022年1月6日閲覧。 ^ “Using Side-by-Side Assemblies as a Resource” (英語). MSDNライブラリ. マイクロソフト (2007年11月1日). 2008年11月8日閲覧。 ^ アプリケーションで共有する Side-by-Side コンポーネントの実装 (拡張) | Microsoft Docs ^ DLL Hellを解消する新しいWindowsインストーラとアセンブリ（5/7） - ＠IT 以下はMSDNライブラリ内 Windows XP で分離アプリケーションと Side-by-Side アセンブリをビルドし、サービスを提供する方法 Isolated Applications and Side-by-side Assemblies DLL地獄 グローバル アセンブリ キャッシュ Happy SysAdm: Windows 2008 space issue and WinSxS growing fast