我用P/Invoke调用来包装本机API。对于错误处理,我使用以下方法:用P/Invoke提高托管和非托管回调链的异常
- 从托管代码中获取回调函数。
- 从非托管代码调用此回调函数以指示错误。
- 在回调中抛出异常。
换句话说流动是这样的:
Managed Method => (P/Invoke) Unmanaged Function => Managed Callback => Throw Exception.
当我测试此方法我可以成功地捕获该异常在所述第一管理方法。但是,我不能100%确定这不会对堆栈或泄漏内存造成任何副作用。
使用这种方法安全吗?如果没有,是否有任何其他方法来指示错误(可能包括堆栈跟踪)而不使用P/Invoke混淆API?
P.S.我有权访问本机代码。
托管回调的工作是什么?如果存在的唯一原因是引发一个管理异常,那么您应该考虑编写一个C++/CLI互操作程序集,而不需要托管回调。 – IInspectable
是的,我知道C++/CLI,但项目是以P/Invoke方法开始的,它需要一定量的工作来转换现有的功能。 –
您可以继续使用P/Invoke,然后将混合模式互操作程序集用于新代码。无论如何,这并没有完全回答我所问的问题。 – IInspectable