Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C+;抛出时,异常详细信息丢失+;通过COM互操作连接到C#?_C#_.net_Com_Interop_Exception - Fatal编程技术网

从C+;抛出时,异常详细信息丢失+;通过COM互操作连接到C#?

从C+;抛出时,异常详细信息丢失+;通过COM互操作连接到C#?,c#,.net,com,interop,exception,C#,.net,Com,Interop,Exception,我正在使用c#代码中的cpp COM对象。 我的c#代码如下所示: try { var res = myComServer.GetSomething(); } catch (Exception e) { } 但是,异常从不包含我在cpp中设置的任何详细信息,特别是我的错误消息 在我的cpp方面,我遵循了我在web上找到的几个示例: ... ICreateErrorInfo *pcerrinfo; IErrorInfo *perrinfo; HRESULT hr;

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

try
{
   var res = myComServer.GetSomething();
}
catch (Exception e) { }
但是,异常从不包含我在cpp中设置的任何详细信息,特别是我的错误消息

在我的cpp方面,我遵循了我在web上找到的几个示例:

...
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服务器本身的属性?

不是捕获异常类型,而是像这样捕获类型

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

您的COM类是否支持?

假设您的类实现了
ISupportErrorInfo
,那么您是否在从Visual Studio将库导入C#项目后添加了支持

导入COM库时,VisualStudio生成只需与COM库对话一次的gunk。为此,它基于导入时DLL的TypeLib中可用的信息,构建了一个名为“originalDllName.Interop.DLL”的特殊翻译DLL


您可以随时更改实现,而不会遇到麻烦;但是,如果您以任何方式更改了库(添加了新类、更改了接口定义、更改了类实现的iTerFace…),则必须从引用中删除COM DLL,然后重新导入,才能刷新互操作DLL。

我也面临着同样的问题。我在COM模块中实现了代码>和 UpFrutsServReRooRebug <代码>方法。但是,在C++异常中,我没有得到C++中的“代码> PrRoReFiels/Cuff>”中设置的错误描述。在我的例子中,头文件中缺少
COM\u INTERFACE\u entry(ISupportErrorInfo)
的条目。

因为COMException是从系统派生的。异常这与异常详细信息没有区别。它只是一个更具体的过滤器。子类比基类有更多的信息。COM例外的相关信息。我一点也不明白你的意思。COMException(或者更准确地说,它的基本ExternalException)只有一个额外的成员,那就是ErrorCode。此成员包含错误的HRESULT。但是,HRESULT也将包含在System.Exception的消息和HRESULT属性中。没错。我以为COMException使用了System.Exception.Message以外的其他东西,但它没有。我被纠正了。+1这是一个有趣的猜测。我可以看出,web上的示例可能只关注细节,而忽略了使用ISupportErrorInfo标记类。