我在VS 2008、C#、.NET 3.5和VSTO中创建了一个Office插件,它通过ClickOnce部署。运行时配置表单执行regsvr32来注册"fooapi.dll",该文件由于ClickOnce限制而无法在安装期间注册。是否有首选的方法来检查并在C#中查看"fooapi.dll"是否已在运行时注册?
尝试使用Type.GetTypeFromCLSID或Type.GetTypeFromProgID方法快速检查COM接口是否存在。
另外,只需实例化对象并捕获异常即可,例如:
catch(COMException ex) {
if(ex.ErrorCode == -2147221164) {
// Retrieving the COM class factory for component with CLSID XXXX failed
}
}
更新:
这个重载方法似乎是唯一一个在无法实例化COM对象时返回null
的方法。
Type.GetTypeFromCLSID
之美在于,无论CLSID是否有效,它始终返回System.__ComObject。 - rpattabiSystem.Type.GetTypeFromProgID(string progID, bool throwOnError)
如果你遇到了 System.Runtime.InteropServices.COMException
,那么这意味着 progID 没有被注册。
如果您知道DLL的GUID,您可以检查在HKCU\SOFTWARE\Classes
中是否存在注册表键。
HKEY_CLASSES_ROOT\CLSID\{your_CLSID}
,并确保其下面的值正确。您可能只需要查找 InprocServer32
和 Codebase
值,但您也可以选择进行更广泛的检查。new
,CLR 可能能够通过 COM 找出正确的程序集并加载它。(是的,有时它会很聪明 :-))。您应该明确地调用 P/Invoke 到 CoCreateInstance
。我认为最简单的方法是尝试创建位于fooapi.dll中的组件。将创建代码放入try/catch块中,并捕获生成的异常,如果DLL未正确注册,则会生成异常。这是检查正确注册的最可靠的方法。