クラス ライブラリ プロジェクトとして作成されたデスクトップ アプリケーションと BHO プラグインを含む VS 2008 でインストーラーを作成しています。手動で、このコマンド [regasm /codebase "myPlugin.dll" register] を使用して myPlugin.dll を登録できますが、セットアップ プロジェクトでこれを実現する方法がわかりません。
1 に答える
これを行う最も簡単で安全な方法は、登録する 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"