ヘルプの「グローバル アセンブリ キャッシュ」によると、アセンブリをグローバルアセンブリキャッシュ(GAC)に配置する方法は3通りあります。その3つの方法とは、次の通りです。
注:WindowsエクスプローラのWindows\assemblyディレクトリの表示には、アセンブリキャッシュビューア(Shfusion.dll)というWindowsのシェル拡張機能が使われています。
インストーラを使ってこれを実現するとなると当然Windowsエクスプローラを使った方法は使えませんので、1か2の方法を使う他ありません。さらにここではWindows Installerを使わない方法ということなので、2の方法しか残りません。よってここではGacutil.exeを使う方法を考えます。
注意:ヘルプの「グローバル アセンブリ キャッシュ」にあるように、配置時にアセンブリをGACにインストールするには、Windows Installer 2.0以上を使わなければならず、それ以外の方法は開発時にのみ使用すべきとされています。ここではGacutil.exeを使った方法を紹介しますが、本来はWindows Installerを使うべきであることを覚えておいてください。
Gacutil.exeを使ってGACにアセンブリをインストールするには「/i」オプションを、アンインストールするには「/u」オプションを使用します。具体的には、アセンブリをGACにインストールするには
Gacutil.exe /i (アセンブリのパス)
とし、アンインストールするには
Gacutil.exe /u (アセンブリ名)
とします。(注)
注:このようなアセンブリ名を指定してアンインストールすると、複数のバージョンのアセンブリがインストールされていた時は、そのすべてがアンインストールされてしまいます。特定のバージョンのアセンブリのみをアンインストールするには、完全限定名を指定します。
ヘルプによると、実際の製品のインストールにGacutil.exeを使用する場合は、参照カウントをサポートするオプション「/r」を使用しろということです。/rオプションでは3つのインストールスキームタイプのうち、1つを使用します。インストールするアプリケーションが「アプリケーションの追加と削除」に追加される場合は、インストールスキームタイプとしてUNINSTALL_KEYを使用できます。「アプリケーションの追加と削除」に追加しない場合は、FILEPATHを使用できます。また独自に管理する場合は、OPAQUEを使用します。
具体例を示しましょう。ここではOPAQUEを使用します。次のようにしてGACにアセンブリをインストールします。"MyApplication1"と"my application 1"の部分はインストールするアプリケーションによって適当に変更します。
Gacutil.exe /ir (アセンブリのパス) OPAQUE "MyApplication1" "my application 1"
アンインストールするには、次のようにします。
Gacutil.exe /ur (アセンブリ名) OPAQUE "MyApplication1" "my application 1"
Gacutil.exeの使い方は理解できたものとし、次に進みましょう。インストーラからこのGacutil.exeを呼び出す方法は、「Windows Installer以外のインストーラでWindowsサービスアプリケーションをインストールする」で紹介したInstallUtil.exeを呼び出す方法と全く同じです。つまり、そちらで示したコードの「InstallUtil.exe」を「Gacutil.exe」に変更するだけで使用できるでしょう。よってGacutil.exeを呼び出す方法はそちらを参考にしていただくこととし、ここでは説明しません。
さて、実はGacutil.exeを使う以外にも方法があります。.NET Framework 1.1からはSystem.EnterpriseServices.Internal名前空間PublishクラスのGacInstallとGacRemoveメソッドでアセンブリのGACへのインストール、アンインストールを行うことができます。ただしこの方法では残念ながら参照カウントの追加ができないようなので、Gacutil.exeを使った方がより優れているといえるでしょう。
以下にGacInstall、GacRemoveメソッドを使ってGACにアセンブリをインストール、アンインストールするプログラムの例を示します。
[VB.NET] VB.NETのコードは現在準備中です。 Convert C# to VB.NET により、 下記のC#のコードをVB.NETに変換したものを参考にしてください。
public class GacInst { private static void Main(string[] args) { if (args.Length == 0) { ShowError("引数が不正です。"); return; } System.EnterpriseServices.Internal.Publish pub = new System.EnterpriseServices.Internal.Publish(); if (args[0] == "/i") { try { //GACにインストール pub.GacInstall(args[1]); } catch { ShowError("GACへのインストールに失敗しました。"); return; } } else if (args[0] == "/u") { try { //GACからアンインストール pub.GacRemove(args[1]); } catch { ShowError("GACからのアンインストールに失敗しました。"); return; } } else { ShowError("引数が不正です。"); return; } System.Environment.ExitCode = 0; } private static void ShowError(string msg) { System.Windows.Forms.MessageBox.Show( null, msg + "\nGACへのインストール/アンインストールに失敗しました。", "エラー", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); System.Environment.ExitCode = 1; } }
このプログラム(「gacinst.exe」とする)の使用法を示します。オプション/iでインストールします。
gacinst.exe /i (アセンブリファイルのフルパス)
またオプション/uでアンインストールします。このとき、アセンブリ名ではなく、アセンブリファイルのフルパスを指定することに注意してください。
gacinst.exe /u (アセンブリファイルのフルパス)
(この記事は、「.NETプログラミング研究」の第62号で紹介したものを基にしています。)