lev*_*kin 3 c# c++ pinvoke interop .net-core
在使用 pinvoke 并在 Linux 上运行的 dotnet 核心应用程序中,当 c++ 抛出异常时 - 例如 -std::runtime_error我们得到:
terminate called recursively
terminate called after throwing an instance of 'terminate called after throwing an instance of 'std::runtime_error*'
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
即使外部 C++ 方法的调用包装在托管代码中的 try catch 块中。
如何在 dotnet core 托管代码中捕获和处理这个问题?
我设置了这个最小、完整且可验证的示例来演示本机异常是如何发生的,演示了Linux 上的托管 C# .NET Core 代码如何不捕获
\n\n正如我打开的问题中所描述的dotnet/coreclr中所描述的,我已经尝试了武器库中的任何可能的武器,但没有成功。
dotnet团队给出的直接答案是:
\n\n\n\n\n我们不支持 Unix 上的异常处理互操作。没有什么好的办法。Mono 项目在这里有一篇很棒的文章:http://www.mono-project.com/docs/advanced/pinvoke/#runtime-exception-propagation。同样的推理也适用于 .NET Core。
\n
Mono项目的解决方案,也是dotnet团队推荐的,是:
\n\n\n\n\nC++ 异常需要映射到 \xe2\x80\x9cout\xe2\x80\x9d 参数或返回值,以便托管代码可以知道发生了什么错误,并且(可选)向 \xe2\x80 抛出托管异常\x9cpropagate\xe2\x80\x9d 原始 C++ 异常。
\n
这就是我们最终实现的,而且,它有效:)。
\n| 归档时间: |
|
| 查看次数: |
1574 次 |
| 最近记录: |