C#中的COM异常

时间:2009-05-24 16:12:15

标签: c# .net com interop exception

我正在使用c#代码中的cpp COM对象。 我的c#代码如下所示:

try
{
   var res = myComServer.GetSomething();
}
catch (Exception e) { }

但是异常永远不会包含我在cpp中设置的任何细节,特别是我的错误消息。

在我的cpp方面,我已经在网上找到了几个例子:

...
ICreateErrorInfo *pcerrinfo;    
IErrorInfo *perrinfo;    
HRESULT hr;    
hr = CreateErrorInfo(&pcerrinfo);    
pcerrinfo->SetDescription(L"C++ Exception");    
hr = pcerrinfo->QueryInterface(IID_IErrorInfo, (LPVOID FAR*) &perrinfo);  
if (SUCCEEDED(hr))    
{  
  SetErrorInfo(0, perrinfo);  
  perrinfo->Release();    
}  

pcerrinfo->Release();    
return E_FAIL;  // E_FAIL or other appropriate failure code  
...

我错过了什么吗? 是否还有其他任何可能影响这一点的内容,例如编组,互操作创建或com服务器本身的属性?

4 个答案:

答案 0 :(得分:6)

您的COM类是否支持ISupportErrorInfo

答案 1 :(得分:2)

假设您的类确实实现了ISupportErrorInfo,您是否有机会在Visual Studio中添加支持 AFTER 将库导入您的C#项目?

导入库时,Visual Studio只生成一次与COM库通信所需的块。为此,它根据导入时DLL的TypeLib中可用的信息,构建一个名为“ originalDllName .Interop.dll”的特殊转换DLL。

您可以根据需要随时更改实施;但是如果您以任何方式更改了库(添加了新类,更改了接口定义,更改了类实现的接口......),则必须从References中删除COM DLL,然后重新导入它,用于刷新Interop DLL。

答案 2 :(得分:1)

我正面临着完全相同的问题。我已经在COM模块中实现了ISupportErrorInfoInterfaceSupportsErrorInfo方法。不过,在C#异常中,我没有得到在C ++方面在perrorinfo中设置的错误描述。就我而言,头文件中缺少COM_INTERFACE_ENTRY(ISupportErrorInfo)条目。

答案 3 :(得分:-1)

不要捕捉Exception类型,而是抓住COMException这样的类型......

try
{
  // COM call
} 
catch( COMException cEx )
{
  // Check HRESULT here
}