我有非托管 C++ 通过 Marshal::GetFunctionPointerForDelegate 提供的函数指针调用托管委托。该委托有可能引发异常。我需要能够在我的非托管 C++ 中正确处理此异常,以确保诸如指针清理之类的事情,并可能将异常重新抛出到更多托管代码中。调用堆栈类似于:
托管代码 -> 非托管 C++ -> 通过委托回调托管代码(此处可以抛出异常)。
任何人都有正确处理这种情况的指针,以便可以清理非托管代码中的资源,并且可以向启动整个调用堆栈的托管代码抛出可用异常?
我有非托管 C++ 通过 Marshal::GetFunctionPointerForDelegate 提供的函数指针调用托管委托。该委托有可能引发异常。我需要能够在我的非托管 C++ 中正确处理此异常,以确保诸如指针清理之类的事情,并可能将异常重新抛出到更多托管代码中。调用堆栈类似于:
托管代码 -> 非托管 C++ -> 通过委托回调托管代码(此处可以抛出异常)。
任何人都有正确处理这种情况的指针,以便可以清理非托管代码中的资源,并且可以向启动整个调用堆栈的托管代码抛出可用异常?
从托管代码中捕获
try
{
throw gcnew InvalidOperationException();
}
catch(InvalidOperationException^ e)
{
// Process e
throw;
}
和
[assembly:RuntimeCompatibility(WrapNonExceptionThrows = true)];
在您的程序集上捕获托管和非托管异常
甚至不要远程尝试让“非托管”代码意识到它必须处理 .NET 的事实。
从您的回调中返回一个非零值以表示存在错误。提供描述错误的(线程本地)全局字符串对象,以便您可以为用户检索有用的错误消息。
这可能涉及将您的委托包装到场景下的另一个函数中,该函数将捕获所有异常并返回错误代码。
一种方法是使用 SEH,并在继续异常传播之前在异常过滤器中进行清理。但我不确定这是否过度合法,因为你会在过滤器中做很多工作。您也不会对正在传播的托管异常一无所知。
另一种方法是用您自己的托管函数包装托管委托,该托管函数捕获异常,然后引发非托管异常......然后您可以在非托管代码中捕获该异常。
当非托管代码完成清理后,使用另一个辅助托管函数重新抛出原始托管异常
与 C++ 不同,托管代码将异常表示为硬件异常。你可以使用 SEH。请记住,您总是有机会运行异常过滤器。
http://msdn.microsoft.com/en-us/library/ms680657(v=VS.85).aspx
有人告诉我...{如果变量 a&b 未在作用域过程中声明,则向量无法显示。经过一番挖掘发现循环漏洞如下--- weibull_distribution> unmanaged_code