2010-07-09 7 views
11

Я создал надстройку Office в VS 2008, C#, .NET 3.5 и VSTO. Он развертывается через ClickOnce. Форма конфигурации времени выполнения выполняет regsvr32 для регистрации «fooapi.dll», включенного в проект, который не может быть зарегистрирован во время установки из-за ограничений ClickOnce. Есть ли какой-либо предпочтительный способ проверить и проверить, зарегистрирована ли «fooapi.dll» во время выполнения на C#?Как проверить, зарегистрирована ли COM-библиотека в C#

+2

Erm, ваши надежды на то, что regsvr32 сможет зарегистрировать, что COM-сервер должен быть тонким. Он требует прав администратора. Используйте reg-free COM. –

ответ

4

Пробуйте 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 не может быть реализован.

+2

Красота с 'Type.GetTypeFromCLSID' заключается в том, что она всегда возвращает System .__ ComObject независимо от того, действителен ли CLSID – rpattabi

1

Я думаю, что самый простой способ - попытаться создать компонент, который живет в fooapi.dll. Заверните код создания в блоке try/catch и поймайте исключение, которое создается, если DLL неправильно зарегистрирована. Это самый надежный способ проверить правильность оформления.

2

Если вы знаете GUID DLLs, вы можете проверить наличие ключей реестра в поле HKCU\SOFTWARE\Classes.

2

Проверьте наличие HKEY_CLASSES_ROOT\CLSID\{your_CLSID} и соответствующие значения под ним. Возможно, вам удастся найти только InprocServer32 и Codebase, но вы также можете отказаться от более подробной проверки.

Вы также можете просто создать экземпляр компонента. Однако, если и компонент, и клиент являются C#, и вы используете new, CLR может определить правильную сборку и загрузить ее с помощью COM. (Да, это может быть так умно, как иногда :-)). Вы должны явно указать p/invoke на CoCreateInstance

2

Если у вас есть Progid компонента в DLL, вы можете попытаться получить тип:

System.Type.GetTypeFromProgID(string progID, bool throwOnError) 

Если вы System.Runtime.InteropServices.COMException, это означает, что Progid не зарегистрирован.