从C+;抛出时,异常详细信息丢失+;通过COM互操作连接到C#?
我正在使用c#代码中的cpp 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;
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模块中实现了
COM\u INTERFACE\u entry(ISupportErrorInfo)
的条目。因为COMException是从系统派生的。异常这与异常详细信息没有区别。它只是一个更具体的过滤器。子类比基类有更多的信息。COM例外的相关信息。我一点也不明白你的意思。COMException(或者更准确地说,它的基本ExternalException)只有一个额外的成员,那就是ErrorCode。此成员包含错误的HRESULT。但是,HRESULT也将包含在System.Exception的消息和HRESULT属性中。没错。我以为COMException使用了System.Exception.Message以外的其他东西,但它没有。我被纠正了。+1这是一个有趣的猜测。我可以看出,web上的示例可能只关注细节,而忽略了使用ISupportErrorInfo标记类。