如何在使用它们运行操作之前检查COM对象是否存在(已注册/可用/可以无问题地运行)?
我的应用程序应该使用其他应用程序COM(InteropServices),但在我开始一些操作之前,我想检查一下是否可以创建COM对象。
如果COM位于同一目录中,但它们不是。
,这是一个问题例如。 我想检查是否这样:
CDNBase.ApplicationClass App = new CDNBase.ApplicationClass();
会导致可捕获的异常或其他内容。我可以创建漂亮的MessageBox并阻止一些事件,直到它将被修复。 任何其他解决方案,如检查命名空间是否存在或者是,也可以(我猜:D)
我尝试使用try / catch,但是它失败了,谷歌没有给我带来任何特别的东西,所以即时通讯请求你的帮助。
提前致谢
答案 0 :(得分:2)
没人喜欢看错误信息。但这是一个特例,不要这样做。 COM激活一直很难解决问题。但最近的发展,如64位操作系统,注册表虚拟化,注册表重定向和UAC,已经成倍增加了它可能无法工作的方式。
客户的IT员工需要的最后一件事是另一层代码,它会默默地更改激活规则或抑制诊断信息。当它不起作用时,它们会向你发射一些严重的瑕疵并且无法找到原因。
首先问问自己,当互操作不起作用时,你的程序是否仍然有用。如果它不是什么都不做,只是让异常终止你的程序,但确保异常细节可见。
如果它仍然有用,那么只需在您的程序中添加一个配置选项,让它绕过互操作,甚至不用尝试。
答案 1 :(得分:1)
您是否尝试过捕捉ComException
:
try
{
...
}
catch(System.Runtime.InteropServices.COMException ex)
{
// log error message
throw;
}
更新:道歉,我并不打算压制异常。已更新。
或者,您可以在注册表中搜索组件的ClassID
:
HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32
默认值将包含DLL的文件系统完整路径。