Я создал Дополнение Office в VS 2008, C#.NET 3.5, и VSTO. Это развертывается через ClickOnce. Форма конфигурации во время выполнения выполняет regsvr32 для регистрации "fooapi.dll", включенного в проекте, который не может быть зарегистрирован во время, устанавливают из-за ограничений ClickOnce. Там кто-либо - предпочтенный способ проверить и видеть, регистрируется ли "fooapi.dll" во время времени выполнения в 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:
Эта перегрузка, похоже, единственная, которая действительно возвращает null
, если COM-объект не может быть инстанцирован.
Если у вас есть progID компонента в DLL, вы можете попробовать получить Type:
System.Type.GetTypeFromProgID(string progID, bool throwOnError)
Если вы получите System.Runtime.InteropServices.COMException
, это означает, что progID не зарегистрирован.
Проверьте наличие HKEY_CLASSES_ROOT\CLSID\{ваш_CLSID}
и соответствующих значений под ним. Вероятно, можно обойтись только поиском значений InprocServer32
и Codebase
, но можно воспользоваться и более обширной проверкой.
Вы также можете просто создать экземпляр компонента. Однако, если и компонент, и клиент - C#, и вы используете new
, CLR сможет определить нужную сборку и загрузить ее, не обращаясь к COM. (Да, иногда он может быть таким умным :-)). Вы должны явно p/invoke на CoCreateInstance
Я думаю, что самый простой способ - это попытаться создать компонент, который находится в fooapi.dll. Оберните код создания в блок try/catch и поймайте исключение, которое будет сгенерировано, если DLL не зарегистрирована должным образом. Это самый надежный способ проверить правильность регистрации
Если вы знаете GUID DLL, вы можете проверить существование ключа реестра в HKCU\SOFTWARE\Classes