DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

グローバルアセンブリキャッシュにアセンブリをインストールする

ヘルプの「グローバル アセンブリ キャッシュ」によると、アセンブリをグローバルアセンブリキャッシュ(GAC)に配置する方法は3通りあります。その3つの方法とは、次の通りです。

  1. Windows Installerを使ってインストールする
  2. グローバルアセンブリキャッシュツール(Gacutil.exe)を使う
  3. WindowsエクスプローラのWindows\assemblyディレクトリにアセンブリをドロップする(注)
注: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を使用する方法

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の使い方は理解できたものとし、次に進みましょう。インストーラからこのGacutil.exeを呼び出す方法は、「Windows Installer以外のインストーラでWindowsサービスアプリケーションをインストールする」で紹介したInstallUtil.exeを呼び出す方法と全く同じです。つまり、そちらで示したコードの「InstallUtil.exe」を「Gacutil.exe」に変更するだけで使用できるでしょう。よってGacutil.exeを呼び出す方法はそちらを参考にしていただくこととし、ここでは説明しません。

Publish.GacInstallメソッドを使用する方法

さて、実はGacutil.exeを使う以外にも方法があります。.NET Framework 1.1からはSystem.EnterpriseServices.Internal名前空間PublishクラスのGacInstallとGacRemoveメソッドでアセンブリのGACへのインストール、アンインストールを行うことができます。ただしこの方法では残念ながら参照カウントの追加ができないようなので、Gacutil.exeを使った方がより優れているといえるでしょう。

以下にGacInstall、GacRemoveメソッドを使ってGACにアセンブリをインストール、アンインストールするプログラムの例を示します。

VB.NET
コードを隠すコードを選択
[VB.NET]
VB.NETのコードは現在準備中です。
Convert C# to VB.NET により、
下記のC#のコードをVB.NETに変換したものを参考にしてください。
C#
コードを隠すコードを選択
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 Tipsをご利用いただく際は、注意事項をお守りください。