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

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

我正在用 P/Invoke 调用封装原生 API。对于错误处理,我使用以下方法:

也就是说流程是这样的:

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

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

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

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

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

在特定条件下:

  • 非托管函数可以处理 SEH 异常(C++ 可以,但 C 不能)
  • 非托管函数会将异常传递给其调用者,因此其调用者必须能够理解和处理托管异常(或向上传递)。

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