Если установщик не регистрирует COM-объекты с использованием механизма по умолчанию, вы можете попробовать принудительно применить его с помощью специального действия. Дополнительным преимуществом этого метода является то, что вы можете пошагово выполнять пользовательское действие, чтобы понять, что происходит.
Добавить класс к вашему проекту, который наследуется от Installer, украшен этим атрибутом
[RunInstaller(true)]
и переопределяет один или несколько из следующих методов:
Install()
Uninstall()
Commit()
Rollback()
Вот полный пример, который выполняет регистрацию в COM Interop. Он усыпан выводом трассировки, который (вопреки некоторым мнениям) будет отображаться в Sysinternals DebugVw. Когда встроено в конфигурацию отладки, появится диалоговое окно, которое позволяет вам присоединить отладчик и выполнить одно действие с пользовательским действием.
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TiGra
{
/// <summary>
/// Custom install actions that must be carried out during product installation.
/// </summary>
[RunInstaller(true)]
public class MyInstaller : Installer
{
/// <summary>
/// Custom Install Action that performs custom registration steps as well as
/// registering for COM Interop.
/// </summary>
/// <param name="stateSaver">Not used<see cref="Installer"/></param>
public override void Install(System.Collections.IDictionary stateSaver)
{
Trace.WriteLine("Install custom action - Starting registration for COM Interop");
#if DEBUG
MessageBox.Show("Attach debugger to this process now, if required", "Custom Action Debug", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
#endif
base.Install(stateSaver);
RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(this.GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
{
Trace.WriteLine("COM registration failed");
throw new InstallException("Failed To Register for COM Interop");
}
Trace.WriteLine("Completed registration for COM Interop");
}
/// <summary>
/// Custom Install Action that removes the COM Interop component registrations.
/// </summary>
/// <param name="savedState">Not used<see cref="Installer"/></param>
public override void Uninstall(System.Collections.IDictionary savedState)
{
Trace.WriteLine("Uninstall custom action - unregistering from COM Interop");
try
{
base.Uninstall(savedState);
RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.UnregisterAssembly(this.GetType().Assembly))
{
Trace.WriteLine("COM Interop deregistration failed");
throw new InstallException("Failed To Unregister from COM Interop");
}
}
finally
{
Trace.WriteLine("Completed uninstall custom action");
}
}
}
}
Последнее, что осталось сделать. Пользовательские действия не будут выполняться, если установщик не настроен для этого. Вот как это сделать:
- В проекте установки Visual Studio щелкните правой кнопкой мыши имя проекта и выберите «Просмотр» -> «Пользовательские действия». Вы увидите вид дерева примерно так:
- Пользовательские действия
- Установить
- Uninstall
- Commit
- Откат
- Щелкните правой кнопкой мыши самый верхний узел (Пользовательские действия) и выберите Добавить настраиваемое действие .
- Перейдите к выходному файлу или проекту, содержащему ваш класс, украшенный атрибутом [RunInstaller (true)], выделите его и нажмите OK.
- Выходные данные вашего проекта должны появиться под каждым из четырех узлов. Это означает, что ваш класс пользовательских действий будет вызываться на каждом из четырех этапов установки.
Если вам нужен более точный контроль над этим, вы можете добавить класс настраиваемых действий для некоторых этапов установщика, но не для других. Например, если установка и удаление выполняются разными сборками, необходимо добавить одну сборку под узлами Install и Commit, а другую - под узлами удаления и отката.
Вот и все, теперь ваши пользовательские действия будут вызываться во время установки. Быстрый совет по отладке пользовательских действий. Используйте условную директиву (как в приведенном выше примере), чтобы отобразить окно сообщения в отладочной сборке. Это окно сообщения будет отображаться во время настройки. Это эффективно приостанавливает процесс установки до тех пор, пока вы не нажмете OK в окне сообщения, и это даст вам то, что вы могли бы назвать «окном возможностей» (каламбур), чтобы присоединить отладчик к процессу msiexec.exe. Будет запущено несколько процессов msiexec.exe, вам нужно выбрать тот, который говорит, что это управляемый код. Отладчик будет подключен, и ваши точки останова «загорятся», так что вы сможете затем перехватить выполнение и выполнить один шаг через ваше пользовательское действие.