我在VS 2008,C#,.NET 3.5和VSTO中创建了一个Office加载项。它通过ClickOnce部署。运行时配置表单执行regsvr32以注册由于ClickOnce限制而无法在安装期间注册的项目中包含的“fooapi.dll”。是否有任何首选的方法来检查并查看在C#中运行时是否注册了“fooapi.dll”?
答案 0 :(得分:4)
尝试使用Type.GetTypeFromCLSID或Type.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}
及其下的正确值。您可能只会查找InprocServer32
和Codebase
值,但您也可以选择加入更广泛的检查。
您也可以只创建组件的实例。但是,如果组件和客户端都是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未正确注册时生成的异常。这是检查正确注册的最可靠方法