gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:10:34 24 4
gpt4 key购买 nike

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

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

换句话说流程是这样的:

托管方法 => (P/Invoke) 非托管函数 => 托管回调 => 抛出异常。

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

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

附言我可以访问 native 代码。

最佳答案

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

在特定条件下:

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

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

关于c# - 使用 P/Invoke 在托管和非托管回调链上引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42298126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com