Как развернуть файл .dll с помощью Visual Studio 2008? - PullRequest
3 голосов
/ 25 декабря 2011

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

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Самый простой и безопасный способ сделать это - создать свой собственный класс установщика, который принимает имя 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"
1 голос
/ 26 декабря 2011

Немного лучшее решение - Как зарегистрировать .NET CCW с помощью regasm из проекта установки Visual Studio 2008

где вы можете добавить класс установщика, а не dll

...