.NET TIPS

GAC(グローバル・アセンブリ・キャッシュ)からファイルを取り出すには?

デジタルアドバンテージ 一色 政彦
2009/03/05

 .NETでは、共有アセンブリ(=.DLLファイル)の配置場所としてGAC(グローバル・アセンブリ・キャッシュ)が提供されている。

 従来、Windows用のプログラムは(バージョン管理機能を備えていない)通常のシステム・フォルダを共有場所として使っていたため、(主に何らかのプログラムをインストールしたときに)古いバージョンの共有.DLLファイルで、すでにインストールされている新しいバージョンの共有.DLLファイルが上書きされてしまい、既存のプログラムが正常に動作しなくなるなど、いわゆる「DLL地獄」の問題が発生することがあった。このような問題に対し、.NETではバージョン管理機能を備える共有アセンブリ管理システムとしてGACが提供されるようになった。

 実際に、.NET Frameworkの基本ライブラリ(例えば「System.dll」ファイルなどのアセンブリ群)はGACで管理され、すべての.NETプログラムで共有利用されている。しかもそのライブラリのすべてのバージョン(CLR 1.0/1.1/2.0)がGACで一元管理されており、システム管理者は「DLL地獄」の問題を一切気にする必要がなくなっている。

 このGACは、具体的には次の場所(=パス)に存在する(「%windir%」は通常は「C:\Windows」)。

%windir%\assembly

 このパスに、例えばWindowsエクスプローラでアクセスすると、次の画面のように.NETアセンブリが一覧表示され、同じファイル名でバージョンだけが異なるものも並列に表示される(次の画面では3つのバージョンの「System」アセンブリが並んで表示されている)。

Windowsエクスプローラで表示したGACの内容

 実はこのWindowsエクスプローラは、実際の物理フォルダの構造をそのまま表示しているわけではなく、システム管理や開発者が.NETアセンブリを一覧したり、管理したり(.NETアセンブリのインストールやアンインストールなど)しやすいようにする目的で提供されている「仮想ビュー」*1なのである。

*1 この仮想ビューは、shfusion.dllファイルによるWindowsエクスプローラのシェル拡張によるもので、正式名称は「Assembly Cache Viewer(アセンブリ・キャッシュ・ビューア)」である(このファイルは「C:\Windows\Microsoft.NET\Framework\v2.0.50727」フォルダ内にある)。

 この仮想ビューのおかげで、GAC内のアセンブリを効率的に参照できるというメリットがあるわけだが、一方で制限もある。具体的には、この仮想ビューでは、GACから.NETアセンブリをコピーしようとしてもコピーできないのだ。そこで本稿では、GACから.NETアセンブリを取り出す方法を紹介する。

■GACから.NETアセンブリを取り出す方法

 GACから.NETアセンブリの.DLLファイルを取り出すには、Windowsエクスプローラではなく、コマンド・プロンプトを使って、直接ファイル・システムにアクセスすればよい。

●GACのフォルダの内容

 まず、[スタート]メニューから[すべてのプログラム]−[アクセサリ]−[コマンド プロンプト]を選択し、コマンド・プロンプトを表示する。そして、次のように入力し、GACのフォルダに移動する(本稿では「ディレクトリ」を、すべて「フォルダ」と表記している)。

cd %windir%\assembly

 そして、

dir

と入力して、フォルダ内の一覧を表示する。すると、次の画面のように「GAC」「GAC_32」「GAC_MSIL」「NaitiveImage_v2.0.50727_32」「temp」「tmp」というフォルダがあることが分かる。

コマンド・プロンプトで表示されたGACのフォルダ

 それぞれのフォルダの意味は、以下のとおりだ。

  • GAC:.NET Framework 1.x対応アセンブリ用のGAC。
  • GAC_32:32bit固有のアセンブリ用のGAC。
  • GAC_64:64bit固有のアセンブリ用のGAC(64bit OSでのみ表示される)。
  • GAC_MSIL:MSILのアセンブリ用(=プラットフォーム非依存のアセンブリ)のGAC。
  • NaitiveImage_<CLRバージョン>:ネイティブ・イメージのインストール用のGAC。
  • tmp:GACへインストールするときに使われる一時領域。
  • temp:GACからアンインストールするときに使われる一時領域。

 ほとんどの.NETアセンブリは「GAC_MSIL」フォルダに格納されている(ちなみに「GAC_32」「GAC_64」「GAC_MSIL」フォルダは.NET Framework 2.0で導入されたもの)。

●「GAC_MSIL」フォルダの内容

 そこで次に、

cd GAC_MSIL
dir

と打ち込んで「GAC_MSIL」フォルダの内容を表示してみる。すると、次の画面のように大量のフォルダが表示される。

「GAC_MSIL」フォルダ内にある大量のアセンブリ・フォルダ

 これらのそれぞれのフォルダは、各アセンブリに対応したフォルダ(以降、アセンブリ・フォルダ)である。

●アセンブリ・フォルダの内容

 次に、このアセンブリ・フォルダを開いてみよう。ここでは例として「Microsoft.VisualStudio.Tools.Office.BuildTasks」アセンブリ(.dllファイル)に対応するフォルダを開いてみる。次のコマンドを入力する。

cd Microsoft.VisualStudio.Tools.Office.BuildTasks

 そして、

dir

と入力してそのフォルダの内容を一覧すると、次のように表示される。

アセンブリ・フォルダ内にあるバージョン・フォルダ

 上の画面を見ると、「9.0.0.0__b03f5f7f11d50a3a」というフォルダが存在するのが分かる。先頭にある「9.0.0.0」はアセンブリのバージョン番号である。このようにしてバージョン番号ごとにフォルダが分けられている(以降、バージョン・フォルダ)。このような構造により、GACは複数の異なるバージョンの.NETアセンブリの配置を可能にしているわけである。

●アセンブリ・フォルダの内容

 バージョン・フォルダの中にアセンブリの実体(=.DLLファイル)が格納されているので、(本稿の例では)次のようなコマンドで、どのような.DLLファイルがあるか表示してみよう。

cd 9.0.0.0__b03f5f7f11d50a3a
dir

 これを実際に行ったのが次の画面だ。

バージョン・フォルダ内にある.DLLファイル

 この画面を見ると、

Microsoft.VisualStudio.Tools.Office.BuildTasks.dll

というファイルが1つ存在するのが分かるが、これが目的の.DLLファイル(=.NETアセンブリの実体)だ。

●.DLLファイルのコピー

 あとは、次のようにcopyコマンドを使って、任意の場所に.DLLファイルをコピーすればよい。

copy Microsoft.VisualStudio.Tools.Office.BuildTasks.dll C:\

 このコマンドを実行すると、GAC内にあった.NETアセンブリの実体(この例では「Microsoft.VisualStudio.Tools.Office.BuildTasks.dll」ファイル)が、Cドライブにコピーされる。End of Article

カテゴリ:CLR 処理対象:GAC

この記事と関連性の高い別の.NET TIPS
[参照の追加]ダイアログに独自のアセンブリを表示するには?
GAC(グローバル・アセンブリ・キャッシュ)の内容をエクスプローラで通常表示するには?
Visual Studio 2005でバージョン情報を設定するには?
無償の逆コンパイラ「ILSpy」を利用するには?
GACコンポーネントをClickOnceで配布するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH