Как я проверяю, регистрируется ли COM dll в C#

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

11
задан Jay 9 July 2010 в 16:20
поделиться

5 ответов

Попробуйте методы 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-объект не может быть инстанцирован.

4
ответ дан 3 December 2019 в 09:40
поделиться

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

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

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

2
ответ дан 3 December 2019 в 09:40
поделиться

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

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

2
ответ дан 3 December 2019 в 09:40
поделиться

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

1
ответ дан 3 December 2019 в 09:40
поделиться

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

2
ответ дан 3 December 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: