通过COM互操作从C ++扔到C#时丢失了异常详细信息吗?

问题描述 投票:2回答:3

我正在使用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服务器本身的属性吗?

c# .net com interop exception
3个回答
6
投票

您的COM类是否支持ISupportErrorInfo


2
投票

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

当导入库时,Visual Studio生成只需要与COM库对话一次的信号。为此,它基于导入时DLL的TypeLib中可用的信息,构建一个名为“

originalDllName

。Interop.dll”的特殊转换DLL。您可以根据需要多次更改实现而不会遇到麻烦;但是如果您以任何方式更改了库(添加了新类,更改了接口定义,更改了由类实现的Iterfaces ...),则必须从引用中删除COM DLL,然后重新导入它,用于刷新Interop DLL。

-1
投票
而不是捕获异常类型,而是捕获COMException类型,就像这样...

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

© www.soinside.com 2019 - 2024. All rights reserved.