グローバルアセンブリキャッシュ

グローバルアセンブリキャッシュGAC )は、 Microsoft .NET Frameworkの共通言語基盤(CLI)用のマシン全体にわたるCLIアセンブリキャッシュです。特別に管理された中央リポジトリを持つというアプローチは、共有ライブラリの概念の欠陥に対処し、 DLL地獄などの欠点につながる他のソリューションの落とし穴を回避するのに役立ちます。

要件

GAC に格納されるアセンブリは、異なるコードバージョンの並列実行を可能にする特定のバージョン管理スキームに準拠する必要があります。具体的には、このようなアセンブリには厳密な名前を付ける必要があります。

使用法

GAC と対話する方法は 2 つあります。グローバル アセンブリ キャッシュ ツール (gacutil.exe) とアセンブリ キャッシュ ビューアー (shfusion.dll) です。

グローバルアセンブリキャッシュツール

gacutil.exeは.NET 1.1に同梱されていた古いコマンドラインユーティリティで、.NET SDKでも引き続き利用可能です。[ 1 ]

次のコマンドを使用して、GAC で共有アセンブリが使用可能かどうかを確認できます。

gacutil.exe /l <アセンブリ名>

次のコマンドを使用して、共有アセンブリを GAC に登録できます。

gacutil.exe /i <アセンブリ名>

または、アセンブリ ファイルを次の場所にコピーします。

%windir%\アセンブリ\

.NET 4.0 の場合、GAC の場所は次のようになります。

%windir%\Microsoft.NET\アセンブリ\

/? フラグを使用する場合、このユーティリティの他のオプションが簡単に説明されます。

gacutil.exe /?

アセンブリ キャッシュ ビューアー

新しいインターフェースであるアセンブリキャッシュビューアーは、Windowsエクスプローラーに統合されています。[ 2 ]%windir%\assembly\(例えばC:\WINDOWS\assembly)またはを 閲覧すると、キャッシュに含まれるアセンブリとそのバージョン、カルチャ、公開キートークン、プロセッサアーキテクチャが表示されます。アセンブリはドラッグアンドドロップでインストールされ、選択してDeleteキーを押すか、コンテキストメニューを使用すること %WINDIR%\Microsoft.NET\assemblyでアンインストールされます。

.NET Framework 4のリリースにより、アセンブリキャッシュビューアシェル拡張機能は廃止されました。[ 3 ]

使用例

コンピュータに2つのCLIアセンブリがあり、どちらもAssemblyAという名前ですが、一方はバージョン1.0、もう一方はバージョン2.0です。両方ともAssemblyAというファイルにコンパイルする必要があるため、FAT32ファイルシステム内の同じディレクトリに存在させることはできません。代わりに、 GACの仮想ファイルシステムは、アセンブリの各バージョンを個別に使用する必要があるプログラムによって使用されます。

実装

GAC という構成要素は、Windows OS 内には実際には存在しません。CLI によって実装および管理されます。%systemroot%内のassemblyおよびMicrosoft.NET\assembly (.NET 4.0 の場合)というフォルダには、グローバルに利用可能なすべてのアセンブリがマネージファイル名で格納されているため、バージョンと公開キートークンを含めることができます。そのため、各バージョンは同じ場所に存在し、後続のバージョンで通常のようにコードエントリポイントの位置を保持することなく呼び出すことができます。Windows エクスプローラーでは、コマンドラインからのインストールが許可されている場合にのみ、このフォルダへのアセンブリのドラッグアンドドロップによるインストールが許可されます。

呼び出し元のアプリケーションは、アセンブリを参照するときにアセンブリのバージョンを指定できるため、ランタイムはファイル名を参照するだけで正しいものを使用できます。

落とし穴

グローバルアセンブリキャッシュのメカニズムは、古いDLL地獄を回避するのに役立ちますが、次のようないくつかの欠点が残っています。[ 4 ]

  • デフォルトでは、アプリケーションはコンパイルに使用されたバージョンの.NET Frameworkでのみ実行されます。そのため、通常は新しいバージョンの .NET Framework でアプリケーションが正常に実行される場合でも、新しいバージョンの .NET Framework がインストールされているマシンではアプリケーションが失敗する可能性があります。
  • アプリケーションで使用されるコア .NET 呼び出しの一部がフレームワークの一部のバージョンでのみサポートされている場合は、条件付きコンパイルを使用する必要があることがあります。
  • ネイティブ コードに依存する .NET アプリケーションでは、GAC メカニズムを使用しても互換性が失われるリスクがあります。
  • GAC に追加されるすべてのアセンブリには、厳密な名前が付けられている必要があります。アセンブリを「厳密な名前」にするプロセスは、状況によっては非常に困難になる場合があります。例えば、あるアセンブリが厳密な名前が付けられていない別のアセンブリに依存している場合、そのアセンブリは GAC に登録できません。サードパーティ製のアセンブリのコードをプログラマーが所有していない場合、アセンブリを厳密な名前に変更することは実際には不可能です。
  • 標準の Windows API を使用してファイルを参照する場合、エクスプローラーが GAC のユーザーフレンドリなビューを表示しているときは、「アセンブリ」フォルダーの下にある DLL を選択することはできません。

参照

参考文献