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

时间:2010-07-09 16:21:00

标签: c# com dll vsto regsvr32

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

5 个答案:

答案 0 :(得分:4)

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

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

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

<强>更新

如果无法实例化COM对象,

This overload似乎是唯一实际返回null的文件。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

检查是否存在HKEY_CLASSES_ROOT\CLSID\{your_CLSID}及其下的正确值。您可能只会查找InprocServer32Codebase值,但您也可以选择加入更广泛的检查。

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

答案 3 :(得分:2)

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

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

如果获得System.Runtime.InteropServices.COMException,则表示未注册progID。

答案 4 :(得分:1)

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