我正在使用C ++应用程序,该应用程序通过COM与C#.NET组件交互。 由于.NET dll引发了一些例外,尽管存在所有异常处理机制,但我的C ++应用程序仍在崩溃。 是否可以在C ++代码中捕获.NET dll抛出的异常?怎么样?
答案 0 :(得分:2)
我不是COM / .NET互操作性方面的专家,但我希望.NET运行时永远不会让异常通过COM方法调用泄漏。相反,我猜运行时会将异常转换为实现IErrorInfo接口的对象。
<强> [编辑] 强> 我刚刚确认了我的假设。以下代码打印出“我怀疑的点网例外...”。
// SERVER: C#
using System.Runtime.InteropServices;
namespace COMInteroperability
{
[Guid("6650E916-B507-483e-9804-8EEDA770F76C")]
interface IFoo
{
[ComVisible(true)]
string Bar(int value);
}
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("92377D62-32CB-4b2b-AE79-B256F54B3E17")]
public class Foo : IFoo
{
public string Bar(int value)
{
throw new Exception("A dotnet exception...");
}
}
}
// CLIENT: C++
#include "stdafx.h"
#import "G:\temp\COMInteroperability\COMInteroperability\COMInteroperability\bin\Debug\COMInteroperability.tlb" no_namespace names_guids raw_interfaces_only
void CheckResult(HRESULT hr)
{
if (SUCCEEDED(hr)) return;
CComPtr<IErrorInfo> error;
if (FAILED(GetErrorInfo(0, &error))) return;
if (!error.p) return;
CComBSTR description;
error->GetDescription(&description);
wprintf(description.m_str);
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(0);
{
CComPtr<_Foo> foo;
CLSID clsid;
CLSIDFromString(L"{92377D62-32CB-4b2b-AE79-B256F54B3E17}", &clsid);
HRESULT hr = foo.CoCreateInstance(clsid);
CheckResult(hr);
if (FAILED(hr))
{
printf("Error %x", hr);
return -1;
}
CComBSTR ret;
CheckResult(foo->raw_Bar(10, &ret));
}
CoUninitialize();
}
<强> [/编辑] 强>
将调试器附加到您的进程,并在崩溃时查看应用程序的状态。
最佳
阿德