如何在C#中检查COM DLL是否已注册

11

我在VS 2008、C#、.NET 3.5和VSTO中创建了一个Office插件,它通过ClickOnce部署。运行时配置表单执行regsvr32来注册"fooapi.dll",该文件由于ClickOnce限制而无法在安装期间注册。是否有首选的方法来检查并在C#中查看"fooapi.dll"是否已在运行时注册?


2
嗯,你希望regsvr32能够注册那个COM服务器的希望应该很渺茫。这需要管理员权限。使用无需注册的COM吧。 - Hans Passant
5个回答

5

尝试使用Type.GetTypeFromCLSIDType.GetTypeFromProgID方法快速检查COM接口是否存在。

另外,只需实例化对象并捕获异常即可,例如:

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

更新:

这个重载方法似乎是唯一一个在无法实例化COM对象时返回null的方法。


2
Type.GetTypeFromCLSID之美在于,无论CLSID是否有效,它始终返回System.__ComObject。 - rpattabi

2
如果您有DLL组件中的ProgID,可以尝试获取Type:
System.Type.GetTypeFromProgID(string progID, bool throwOnError)

如果你遇到了 System.Runtime.InteropServices.COMException,那么这意味着 progID 没有被注册。


2

如果您知道DLL的GUID,您可以检查在HKCU\SOFTWARE\Classes中是否存在注册表键。


2
检查是否存在 HKEY_CLASSES_ROOT\CLSID\{your_CLSID},并确保其下面的值正确。您可能只需要查找 InprocServer32Codebase 值,但您也可以选择进行更广泛的检查。
您还可以创建组件的实例。但是,如果组件和客户端都是 C#,并且您使用 new,CLR 可能能够通过 COM 找出正确的程序集并加载它。(是的,有时它会很聪明 :-))。您应该明确地调用 P/Invoke 到 CoCreateInstance

1

我认为最简单的方法是尝试创建位于fooapi.dll中的组件。将创建代码放入try/catch块中,并捕获生成的异常,如果DLL未正确注册,则会生成异常。这是检查正确注册的最可靠的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接