我在VS 2008,C#,.NET 3.5和VSTO中创建了一个Office加载项。它通过ClickOnce部署。运行时配置表单执行regsvr32以注册由于ClickOnce限制而无法在安装期间注册的项目中包含的“fooapi.dll”。是否有任何首选方法来检查并查看在C#中运行时是否注册了“fooapi.dll”?
我在VS 2008,C#,.NET 3.5和VSTO中创建了一个Office加载项。它通过ClickOnce部署。运行时配置表单执行regsvr32以注册由于ClickOnce限制而无法在安装期间注册的项目中包含的“fooapi.dll”。是否有任何首选方法来检查并查看在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
}
}
更新:
这个超载 似乎是唯一真正返回的人 null 如果COM对象无法实例化。
如果您知道DLL GUID,则可以检查注册表项的存在 HKCU\SOFTWARE\Classes。
检查是否存在 HKEY_CLASSES_ROOT\CLSID\{your_CLSID} 以及它下面的适当值。你可能会逃避寻找 InprocServer32 和 Codebase 仅限值,但您也可以选择加入更广泛的检查。
您也可以只创建组件的实例。但是,如果组件和客户端都是C#并且您使用 new,CLR可能能够找出正确的程序集并通过COM加载它。 (是的,它有时可能很聪明:-))。你应该明确地p / invoke CoCreateInstance
如果你有DLL中组件的progID,你可以尝试获取类型:
System.Type.GetTypeFromProgID(string progID, bool throwOnError)
如果你得到 System.Runtime.InteropServices.COMException,这意味着progID未注册。
我认为最简单的方法是尝试创建生活在fooapi.dll中的组件。将创建代码包装在try / catch块中,并捕获在DLL未正确注册时生成的异常。这是检查正确注册的最可靠方法