使用P/Invoke提高对托管和未管理的回调链的例外
Raising exception on managed and unmanaged callback chain with P/Invoke
我正在用p/indoke呼叫包装本机API。对于错误处理,我使用以下方法:
- 从托管代码中获取回调函数。
- 从非托管代码调用此回调函数以表示错误。
- 在回调中抛出一个例外。
换句话说,流是这样的:
Managed Method => (P/Invoke) Unmanaged Function => Managed Callback => Throw Exception.
当我测试此方法时,我可以在第一个托管方法中成功捕获异常。但是,我不是100%确定这不会对堆栈或泄漏内存造成任何副作用。
使用此方法安全吗?如果没有,是否有其他方法可以指示错误(可能包括堆栈跟踪),而无需使用P/Invoke弄乱API?
P.S。我可以访问本机代码。
简短答案:是的,它是安全的。
在某些条件下:
- 未管理的功能可以处理SEH例外(C 可以,但C不能)
- 未托管的功能将把异常传递给呼叫者,因此其呼叫者必须能够理解和处理托管异常(或通过它传递)。
示例,您无法启动一个新线程,并在新线程中调用托管回调,回调肯定会终止您的应用程序。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 使用P/Invoke提高对托管和未管理的回调链的例外
- C++ std::unique_ptr 管理的对象的回调