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

StackOverflow https://stackoverflow.com/questions/239465

Вопрос

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

  

regasm.exe / tlb / codebase component.dll

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

  • Скомпилируйте свой проект
  • В установщике убедитесь, что вы добавили dll в папку приложения, а затем щелкните правой кнопкой мыши проект установщика и выберите "Просмотр / пользовательские действия"
  • Щелкните правой кнопкой мыши Установить и выберите Добавить настраиваемое действие
  • Дважды щелкните на папке приложения, а затем на своей dll
  • Сделайте то же самое для действия фиксации
  • Создайте и проверьте свой установщик
  • Пошаговое руководство с реальным классом, который вы можете попробовать, можно найти по адресу: http: // leon.mvps.org/DotNet/RegasmInstaller.html

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

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

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

    Установщик Visual Studio выполняет только регистрацию класса COM, но не производит генерацию и регистрацию библиотеки типов (это то, что переключает / tlb в regasm.exe ) дефолт. По крайней мере, в Visual Studio 2017 достаточно сгенерировать библиотеку типов на этапах сборки DLL для регистрации, используя утилиту Tlbexp.exe .

    Если проект установщика обнаруживает файл с расширением .tlb в том же каталоге и с тем же именем, что и устанавливаемая библиотека, он автоматически включает его в проект установки и выполняет шаги регистрации во время установки. Конечно, также можно сгенерировать файл .tlb вручную и включить его в проект установки (и установить для его свойства Register значение vsdrfCOM ).

    Вот отличная статья о C # и интерфейсе COM, а также информация, приведенная выше, взята из раздела «Развертывание».

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top