Как зарегистрировать .NET CCW с помощью regasm из проекта установки Visual Studio 2008
-
04-07-2019 - |
Вопрос
У меня есть проект установки приложения-службы .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.");
}
}
Это также отменяет регистрацию библиотеки при удалении.
Другие советы
Переопределите методы 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 в действии удаления.
Пошаговое руководство с реальным классом, который вы можете попробовать, можно найти по адресу: 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, а также информация, приведенная выше, взята из раздела «Развертывание».