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

» 2009年03月05日 05時00分 公開
[一色政彦デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「.NET TIPS」のインデックス

連載目次

 .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ドライブにコピーされる。

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

「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

総合 記事ランキング

本日月間

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。