2011-12-24 5 views
3

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

答えて

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を選択します。これにより、自動的に4つのセクションすべてにDLLが追加されます。 Commitセクションに追加されたものを右クリックして削除します。他の3つのセクションのそれぞれについて

、次の操作を実行します。

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

プロパティグリッドのInstallerClassエントリがtrueに設定されていることを確認してください。あなたが追加することができますどこ

/AssemblyFileName="[TARGETDIR]\myplugin.dll" 
関連する問題