我有一个CLR托管应用程序,用非托管C ++编写。 我想从非托管C ++代码订阅AppDomain.UnhandledException事件。
导入的AppDomain接口具有以下方法:
HRESULT add_UnhandledException (struct _UnhandledExceptionEventHandler *value);
UnhandledExceptionEventHandler定义为:
struct __declspec(uuid("84199e64-439c-3011-b249-3c9065735adb"))
_UnhandledExceptionEventHandler : IDispatch {};
我不明白如何使用此处理程序将其连接到我的回调函数。 那么,问题是如何使用它?
答案 0 :(得分:2)
我没有看到有人这样做,但它可能会帮助您考虑以下事项:
假设这还不够(你的非托管代码需要知道异常的一些细节)你可以定义com接口(参见下面的idl示例);当您设置appnmain并传入非托管实现IMypplicationSink(您的钩子)时,托管应用程序实现IMyApplication和非托管代码IMyApplicationSink,托管应用程序必须在托管unhandledexception事件处理程序中调用该钩子:
interface IMyApplicationSink : IUnknown
{
HRESULT UnhandeledExceptionCallback(
[in] BSTR aString,
[in] short aNumber,
[in] SAFEARRAY( BYTE ) someBinaryData);
}
interface IMyApplicationControl : IUnknown
{
HRESULT OnStart(
[in] IPhotonApplicationSink *sink);
}
注意:有关如何获取自定义com接口的详细信息,请参阅“自定义Microsoft .NET Framework公共语言运行时”的“实现IHostControl :: SetAppDomainManager”(当前部分可自由阅读here)
如果您无法控制托管应用程序,请首先加载您控制中的应用程序 - 默认应用程序域 - 也将在那里调用未处理的异常处理程序(请参阅msdn)