2008-10-27 4 views
5

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

regasm.exe/TLB/component.dll

кодовой базы

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

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

ответ

13

Вы можете потерять ручной вызов 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."); 
} 
} 

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

+1

Что должен добавить этот код? У меня есть проект VB.net, который нуждается в regasm и имеет некоторые зависимости C#. Эти два метода могут быть добавлены в класс, который реализует, какой суперкласс или интерфейс? – Amala 2012-04-25 16:13:47

1

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

4
  1. В главном проекте (тот, который содержит класс, который вы хотите зарегистрировать), щелкните правой кнопкой мыши файл проекта и выберите «Добавить/новый элемент» и выберите «Класс установщика». Назовите это что-то вроде clsRegisterDll.cs
  2. В конструкторе, который появляется, нажмите кнопку «Нажмите здесь, чтобы перейти в режим просмотра кода» или щелкните правой кнопкой мыши файл clsRegisterDll.cs в обозревателе решений и выберите View Code
  3. Override Установить, Зафиксировать и методы удаления:

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

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

  4. скомпилировать проект
  5. В установщиком, убедитесь, что вы добавили библиотеки DLL в папке приложения, а затем щелкните правой кнопкой мыши проект установки и выберите View/пользовательские действия
  6. правой кнопкой мыши Установить, а затем нажмите кнопку Добавить настраиваемое действие
  7. Двойной щелчок по папке приложения, а затем на библиотеки DLL
  8. Сделайте то же самое для Commit Действие
  9. Построить и проверить установщик

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

+1

Ссылка Wolfwyrd изменилась на http://leon.mvps.org/DotNet/RegasmInstaller.aspx – dashrb 2013-02-14 22:54:50

1

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

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