Я создаю установщик с VS 2008, содержащий настольное приложение и плагин BHO , который создается как проект библиотеки классов. Вручную, я могу зарегистрировать myPlugin.dll с помощью этой команды [regasm/codebase "myPlugin.dll" register], но я не знаю, как это реализовать в Setup Project. Любая идея, пожалуйста?Как развернуть DLL-файл с помощью Visual Studio 2008?
ответ
Самый простой и безопасный способ сделать это - создать собственный класс установщика, который принимает имя зарегистрированной 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"
Slighty лучшее решение на How to register a .NET CCW with regasm from a Visual Studio 2008 Setup project
, где можно добавить класс установщика, а не dll