Самый простой и безопасный способ сделать это - создать свой собственный класс установщика, который принимает имя 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
, и удалите его.
Для каждого из трех других разделов выполните следующие действия:
Щелкните правой кнопкой мыши DLLвведите и выберите Properties Window
.
Убедитесь, что для записи InstallerClass
в сетке свойств установлено значение true (должно быть).
Добавьте следующую запись в свойство CustomActionData
передать имя dll для регистрации классу пользовательской установки:
/AssemblyFileName="[TARGETDIR]\myplugin.dll"