3

クラス ライブラリ プロジェクトとして作成されたデスクトップ アプリケーションと BHO プラグインを含む VS 2008 でインストーラーを作成しています。手動で、このコマンド [regasm /codebase "myPlugin.dll" register] を使用して myPlugin.dll を登録できますが、セットアップ プロジェクトでこれを実現する方法がわかりません。

4

1 に答える 1

2

これを行う最も簡単で安全な方法は、登録する DLL の名前を受け入れ、RegistrationServicesを使用して dll をインストールまたはアンインストールする独自のインストーラー クラスを作成することです。

Installerを作成すると、カスタム アクションの CustomActionData プロパティを介して、カスタム アクションからパラメーターを受け取ることができます。これらの各パラメーターは、Installer.Context.Parameters コレクションに格納されます。これは、一部のインストーラー プロパティを使用することで、インストールされた完全なパスを DLL に渡すことができることを意味します。このパスは、RegistrationServices によって使用され、Regasm と同じアクションを実行できます。

これを実装するには、複数の手順を踏む必要があります。

ステップ 1 は、インストーラー クラスを作成することです。これは再利用可能なコードであるため、このクラスを保持する別の DLL プロジェクトを作成することをお勧めします。

using System;
using System.Text;
using System.ComponentModel;
using System.Configuration.Install;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

[RunInstaller(true)]
public partial class AssemblyRegistrationInstaller : Installer
{
    public AssemblyRegistrationInstaller()
    {
    }

    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        RegisterAssembly(true);
    }

    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);

        RegisterAssembly(false);
    }

    public override void Uninstall(IDictionary savedState)
    {
        base.Rollback(savedState);

        RegisterAssembly(false);
    }

    private void RegisterAssembly(bool fDoRegistration)
    {
        string sAssemblyFileName = base.Context.Parameters["AssemblyFileName"];

        if (string.IsNullOrEmpty(sAssemblyFileName))
        {
            throw new InstallException("AssemblyFileName must be specified");
        }

        if (!File.Exists(sAssemblyFileName))
        {
            if (fDoRegistration)
            {
                throw new InstallException(string.Format("AssemblyFileName {0} is missing", sAssemblyFileName));
            }
            else
            {
                // Just bail if we are uninstalling and the file doesn't exist
                return;
            }
        }

        var oServices = new RegistrationServices();
        var oAssembly = Assembly.LoadFrom(sAssemblyFileName);

        if (fDoRegistration)
        {
            oServices.RegisterAssembly(oAssembly, AssemblyRegistrationFlags.SetCodeBase);
        }
        else
        {
            try
            {
                oServices.UnregisterAssembly(oAssembly);
            }
            catch
            {
                // Just eat the exception so that uninstall succeeds even if there is an error
            }
        }
    }
}

手順 2 では、新しい DLL をセットアップ プロジェクトに追加します。DLL の設定を構成する必要があるため、プロジェクト自体を追加しないでください。プロジェクトのリリース ディレクトリから DLL を直接追加します。

ステップ 3 では、新しい DLL をカスタム アクションとして追加します。これを行うには、セットアップ プロジェクトを右クリックして を選択しView、次にを選択しますCustom Actions

Custom Actionsメニューを右クリックし、ポップアップ ダイアログで新しいインストーラー DLL を選択します。これにより、DLL が 4 つのセクションすべてに自動的に追加されます。Commitセクションに追加されたものを右クリックして削除します。

他の 3 つのセクションのそれぞれについて、次のアクションを実行します。

DLL エントリを右クリックし、 を選択しますProperties Window

InstallerClassプロパティ グリッドのエントリが true に設定されていることを確認します (そうである必要があります)。

次のエントリをCustomActionDataプロパティに追加して、カスタム インストーラー クラスに登録する dll の名前を渡します。

/AssemblyFileName="[TARGETDIR]\myplugin.dll"
于 2011-12-25T01:04:30.240 に答える