使用P/Invoke提高对托管和未管理的回调链的例外

Raising exception on managed and unmanaged callback chain with P/Invoke

本文关键字:管理 回调 Invoke 使用      更新时间:2023-10-16

我正在用p/indoke呼叫包装本机API。对于错误处理,我使用以下方法:

  • 从托管代码中获取回调函数。
  • 从非托管代码调用此回调函数以表示错误。
  • 在回调中抛出一个例外。

换句话说,流是这样的:

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

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

使用此方法安全吗?如果没有,是否有其他方法可以指示错误(可能包括堆栈跟踪),而无需使用P/Invoke弄乱API?

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

简短答案:是的,它是安全的。

在某些条件下:

  • 未管理的功能可以处理SEH例外(C 可以,但C不能)
  • 未托管的功能将把异常传递给呼叫者,因此其呼叫者必须能够理解和处理托管异常(或通过它传递)。

示例,您无法启动一个新线程,并在新线程中调用托管回调,回调肯定会终止您的应用程序。