问题 如何检查COM dll是否在C#中注册


我在VS 2008,C#,.NET 3.5和VSTO中创建了一个Office加载项。它通过ClickOnce部署。运行时配置表单执行regsvr32以注册由于ClickOnce限制而无法在安装期间注册的项目中包含的“fooapi.dll”。是否有任何首选方法来检查并查看在C#中运行时是否注册了“fooapi.dll”?


4937
2017-07-09 16:20


起源

嗯,你希望regsvr32能够注册COM服务器应该很苗条。它需要管理员权限。使用reg-free COM。 - Hans Passant


答案:


试试吧 Type.GetTypeFromCLSID 要么 Type.GetTypeFromProgID 快速检查COM接口是否存在的方法。

或者,只需实例化对象并捕获异常,例如

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

更新:

这个超载 似乎是唯一真正返回的人 null 如果COM对象无法实例化。


4
2017-07-09 16:35



美丽与 Type.GetTypeFromCLSID 无论CLSID是否有效,它总是返回System .__ ComObject - rpattabi


如果您知道DLL GUID,则可以检查注册表项的存在 HKCU\SOFTWARE\Classes


2
2017-07-09 16:29





检查是否存在 HKEY_CLASSES_ROOT\CLSID\{your_CLSID} 以及它下面的适当值。你可能会逃避寻找 InprocServer32 和 Codebase 仅限值,但您也可以选择加入更广泛的检查。

您也可以只创建组件的实例。但是,如果组件和客户端都是C#并且您使用 new,CLR可能能够找出正确的程序集并通过COM加载它。 (是的,它有时可能很聪明:-))。你应该明确地p / invoke CoCreateInstance


2
2017-07-09 16:31





如果你有DLL中组件的progID,你可以尝试获取类型:

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

如果你得到 System.Runtime.InteropServices.COMException,这意味着progID未注册。


2
2017-07-09 16:36





我认为最简单的方法是尝试创建生活在fooapi.dll中的组件。将创建代码包装在try / catch块中,并捕获在DLL未正确注册时生成的异常。这是检查正确注册的最可靠方法


1
2017-07-09 16:25