Подтвердить что ты не робот

Как проверить, зарегистрирована ли COM-библиотека COM в С#

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

4b9b3361

Ответ 1

Попробуйте Type.GetTypeFromCLSID или Type.GetTypeFromProgID методы быстрой проверки существования COM-интерфейса.

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

catch(COMException ex) {
    if(ex.ErrorCode == -2147221164) {
        // Retrieving the COM class factory for component with CLSID XXXX failed
    }
}

UPDATE:

Эта перегрузка является единственной, которая фактически возвращает null, если объект COM не может быть создан.

Ответ 2

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

Ответ 3

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

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

Ответ 4

Если у вас есть progID компонента в DLL, вы можете попробовать получить Type:

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

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

Ответ 5

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