Как зарегистрировать .NET CCW с помощью regasm из проекта установки Visual Studio 2008 - PullRequest
5 голосов
/ 27 октября 2008

У меня есть проект установки приложения-службы .NET, в котором используется компонент .NET, который предоставляет интерфейс COM (COM-вызываемая оболочка / CCW). Чтобы компонент работал на целевой машине, его необходимо зарегистрировать с помощью

regasm.exe / tlb / codebase component.dll

Параметр / tlb для создания библиотеки типов является обязательным в этом случае, в противном случае я не могу создавать объекты из этой сборки.

Вопрос в том, как настроить мой проект установки Visual Studio 2008 для регистрации этой сборки с вызовом regasm / tlb?

Ответы [ 4 ]

13 голосов
/ 10 декабря 2009

Вы можете потерять ручной вызов regasm.exe, используя вместо этого System.Runtime.InteropServices.RegistrationServices:

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
{
    throw new InstallException("Failed to register for COM Interop.");
}

}

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.UnregisterAssembly(GetType().Assembly))
{
    throw new InstallException("Failed to unregister for COM Interop.");
}
}

Это также отменяет регистрацию библиотеки при удалении.

4 голосов
/ 15 января 2009
  1. В вашем основном проекте (тот, который содержит класс, который вы хотите зарегистрировать), щелкните правой кнопкой мыши файл проекта и выберите Добавить / Новый элемент и выберите Класс установщика. Назовите это как clsRegisterDll.cs
  2. В появившемся конструкторе нажмите «Нажмите здесь, чтобы перейти к представлению кода» или щелкните правой кнопкой мыши файл clsRegisterDll.cs в обозревателе решений и выберите «Просмотреть код»
  3. Переопределите методы Install, Commit и Uninstall, добавив:

    // Получить местоположение регазма string regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory () + @ "regasm.exe"; // Получить местоположение нашей DLL строка componentPath = typeof (RegisterAssembly) .Assembly.Location; // Выполнить регазм
    System.Diagnostics.Process.Start (regasmPath, "/ codebase / tlb \" "+ componentPath +" \ "");

    Поменяйте местами / codebase / tlb for / u в действии удаления.

  4. Скомпилируйте ваш проект
  5. В вашем инсталляторе убедитесь, что вы добавили dll в папку приложения, а затем щелкните правой кнопкой мыши проект инсталлятора и выберите View / Custom Actions
  6. Щелкните правой кнопкой мыши «Установить» и выберите «Добавить настраиваемое действие»
  7. Дважды щелкните на папке приложения, а затем на вашей DLL
  8. Сделайте то же самое для действия «Фиксация»
  9. Сборка и тестирование вашего установщика

Пошаговое руководство с реальным классом для вас можно найти по адресу: http://leon.mvps.org/DotNet/RegasmInstaller.html

1 голос
/ 25 августа 2011

Сначала я попытался запустить regasm из процесса установки (до того, как увидел это сообщение). Попытка запустить regasm и обработку всех ошибок была проблематичной - даже без попытки повысить привилегии для Windows 7.

Использование Runtime.InteropServices.RegistrationServices.RegisterAssembly было намного чище и обеспечивало намного лучшее отслеживание ошибок.

1 голос
/ 27 октября 2008

Ваш сервис должен иметь класс Installer. Зарегистрируйтесь в событии OnAfterInstall и вызовите RegAsm: путь должен быть рассчитан из каталога Windows и привязан к определенной версии .Net.

...