この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
.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エクスプローラは、実際の物理フォルダの構造をそのまま表示しているわけではなく、システム管理や開発者が.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アセンブリの.DLLファイルを取り出すには、Windowsエクスプローラではなく、コマンド・プロンプトを使って、直接ファイル・システムにアクセスすればよい。
●GACのフォルダの内容
まず、[スタート]メニューから[すべてのプログラム]-[アクセサリ]-[コマンド プロンプト]を選択し、コマンド・プロンプトを表示する。そして、次のように入力し、GACのフォルダに移動する(本稿では「ディレクトリ」を、すべて「フォルダ」と表記している)。
cd %windir%\assembly
そして、
dir
と入力して、フォルダ内の一覧を表示する。すると、次の画面のように「GAC」「GAC_32」「GAC_MSIL」「NaitiveImage_v2.0.50727_32」「temp」「tmp」というフォルダがあることが分かる。
それぞれのフォルダの意味は、以下のとおりだ。
ほとんどの.NETアセンブリは「GAC_MSIL」フォルダに格納されている(ちなみに「GAC_32」「GAC_64」「GAC_MSIL」フォルダは.NET Framework 2.0で導入されたもの)。
●「GAC_MSIL」フォルダの内容
そこで次に、
cd GAC_MSIL
dir
と打ち込んで「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
これを実際に行ったのが次の画面だ。
この画面を見ると、
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
Copyright© Digital Advantage Corp. All Rights Reserved.
総合 記事ランキング