Как проверить, зарегистрирован ли COM dll в C # - PullRequest
11 голосов
/ 09 июля 2010

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

Ответы [ 5 ]

4 голосов
/ 09 июля 2010

Попробуйте методы 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 голосов
/ 09 июля 2010

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

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

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

2 голосов
/ 09 июля 2010

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

2 голосов
/ 09 июля 2010

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

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

1 голос
/ 09 июля 2010

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

...