使用P / Invoke在托管和非托管回调链上引发异常

时间:2017-02-17 12:35:02

标签: c# c++ exception callback pinvoke

我使用P / Invoke调用包装本机API。对于错误处理,我使用以下方法:

  • 从托管代码中获取回调函数。
  • 从非托管代码调用此回调函数以指示错误。
  • 在回调中抛出异常。

换句话说,流程是这样的:

Managed Method => (P/Invoke) Unmanaged Function => Managed Callback => Throw Exception.

当我测试这个方法时,我可以在第一个托管方法中成功捕获异常。但是,我并非100%确定这不会对堆栈或泄漏内存造成任何副作用。

使用此方法是否安全?如果没有,是否有任何其他方法来指示错误(可能包括堆栈跟踪)而不会使用P / Invoke混乱API?

P.S。我可以访问本机代码。

1 个答案:

答案 0 :(得分:1)

简短回答:是的,这是安全的。

在某些条件下:

  • Unmanaged Function可以处理SEH异常(C ++可以,但C不能)
  • Unmanaged Function会将异常传递给其调用者,因此其调用者必须能够理解和处理Managed异常(或将其传递给上层)。

例如,您无法启动新线程并在新线程中调用托管回调,回调抛出的异常肯定会终止您的应用程序。

相关问题