在对它们执行某些操作之前,C#检查COM对象是否可用

时间:2010-01-30 09:56:53

标签: c# com object

如何在使用它们运行操作之前检查COM对象是否存在(已注册/可用/可以无问题地运行)?

我的应用程序应该使用其他应用程序COM(InteropServices),但在我开始一些操作之前,我想检查一下是否可以创建COM对象。

如果COM位于同一目录中,但它们不是。

,这是一个问题

例如。 我想检查是否这样:

CDNBase.ApplicationClass App = new CDNBase.ApplicationClass();

会导致可捕获的异常或其他内容。我可以创建漂亮的MessageBox并阻止一些事件,直到它将被修复。 任何其他解决方案,如检查命名空间是否存在或者是,也可以(我猜:D)

我尝试使用try / catch,但是它失败了,谷歌没有给我带来任何特别的东西,所以即时通讯请求你的帮助。

提前致谢

2 个答案:

答案 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的文件系统完整路径。