Я создал надстройку Office в VS 2008, C#, .NET 3.5 и VSTO. Он развертывается через ClickOnce. Форма конфигурации времени выполнения выполняет regsvr32 для регистрации «fooapi.dll», включенного в проект, который не может быть зарегистрирован во время установки из-за ограничений ClickOnce. Есть ли какой-либо предпочтительный способ проверить и проверить, зарегистрирована ли «fooapi.dll» во время выполнения на C#?Как проверить, зарегистрирована ли COM-библиотека в C#
ответ
Пробуйте Type.GetTypeFromCLSID или Type.GetTypeFromProgID методы для быстрой проверки наличия COM-интерфейса.
В качестве альтернативы просто создайте объект и поймайте исключение, например.
catch(COMException ex) {
if(ex.ErrorCode == -2147221164) {
// Retrieving the COM class factory for component with CLSID XXXX failed
}
}
UPDATE:
This overload, кажется, только один, который на самом деле возвращает null
если объект COM не может быть реализован.
Красота с 'Type.GetTypeFromCLSID' заключается в том, что она всегда возвращает System .__ ComObject независимо от того, действителен ли CLSID – rpattabi
Я думаю, что самый простой способ - попытаться создать компонент, который живет в fooapi.dll. Заверните код создания в блоке try/catch и поймайте исключение, которое создается, если DLL неправильно зарегистрирована. Это самый надежный способ проверить правильность оформления.
Если вы знаете GUID DLLs, вы можете проверить наличие ключей реестра в поле HKCU\SOFTWARE\Classes
.
Проверьте наличие HKEY_CLASSES_ROOT\CLSID\{your_CLSID}
и соответствующие значения под ним. Возможно, вам удастся найти только InprocServer32
и Codebase
, но вы также можете отказаться от более подробной проверки.
Вы также можете просто создать экземпляр компонента. Однако, если и компонент, и клиент являются C#, и вы используете new
, CLR может определить правильную сборку и загрузить ее с помощью COM. (Да, это может быть так умно, как иногда :-)). Вы должны явно указать p/invoke на CoCreateInstance
Если у вас есть Progid компонента в DLL, вы можете попытаться получить тип:
System.Type.GetTypeFromProgID(string progID, bool throwOnError)
Если вы System.Runtime.InteropServices.COMException
, это означает, что Progid не зарегистрирован.
Erm, ваши надежды на то, что regsvr32 сможет зарегистрировать, что COM-сервер должен быть тонким. Он требует прав администратора. Используйте reg-free COM. –