2011-12-24 2 views
3

Я создаю установщик с VS 2008, содержащий настольное приложение и плагин BHO , который создается как проект библиотеки классов. Вручную, я могу зарегистрировать myPlugin.dll с помощью этой команды [regasm/codebase "myPlugin.dll" register], но я не знаю, как это реализовать в Setup Project. Любая идея, пожалуйста?Как развернуть DLL-файл с помощью Visual Studio 2008?

ответ

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"