5

我有非托管 C++ 通过 Marshal::GetFunctionPointerForDelegate 提供的函数指针调用托管委托。该委托有可能引发异常。我需要能够在我的非托管 C++ 中正确处理此异常,以确保诸如指针清理之类的事情,并可能将异常重新抛出到更多托管代码中。调用堆栈类似于:

托管代码 -> 非托管 C++ -> 通过委托回调托管代码(此处可以抛出异常)。

任何人都有正确处理这种情况的指针,以便可以清理非托管代码中的资源,并且可以向启动整个调用堆栈的托管代码抛出可用异常?

4

5 回答 5

2

从托管代码中捕获

try
{
  throw gcnew InvalidOperationException();
}
catch(InvalidOperationException^ e)
{
  // Process e
  throw;
}

[assembly:RuntimeCompatibility(WrapNonExceptionThrows = true)];

在您的程序集上捕获托管和非托管异常

于 2008-10-08T14:59:51.643 回答
1

甚至不要远程尝试让“非托管”代码意识到它必须处理 .NET 的事实。

从您的回调中返回一个非零值以表示存在错误。提供描述错误的(线程本地)全局字符串对象,以便您可以为用户检索有用的错误消息。

这可能涉及将您的委托包装到场景下的另一个函数中,该函数将捕获所有异常并返回错误代码。

于 2011-06-10T17:32:53.217 回答
0

一种方法是使用 SEH,并在继续异常传播之前在异常过滤器中进行清理。但我不确定这是否过度合法,因为你会在过滤器中做很多工作。您也不会对正在传播的托管异常一无所知。

另一种方法是用您自己的托管函数包装托管委托,该托管函数捕获异常,然后引发非托管异常......然后您可以在非托管代码中捕获该异常。

当非托管代码完成清理后,使用另一个辅助托管函数重新抛出原始托管异常

于 2008-10-08T15:08:51.440 回答
0

与 C++ 不同,托管代码将异常表示为硬件异常。你可以使用 SEH。请记住,您总是有机会运行异常过滤器。

http://msdn.microsoft.com/en-us/library/ms680657(v=VS.85).aspx

于 2011-06-10T17:38:03.167 回答
-1

有人告诉我...{如果变量 a&b 未在作用域过程中声明,则向量无法显示。经过一番挖掘发现循环漏洞如下--- weibull_distribution> unmanaged_code

于 2015-08-15T05:30:43.347 回答