在 dotnet core 中捕获本机异常

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 托管代码中捕获和处理这个问题?

yai*_*air 5

我设置了这个最小、完整且可验证的示例来演示本机异常是如何发生的,演示了Linux 上的托管 C# .NET Core 代码如何不捕获

\n\n

正如我打开的问题中所描述的dotnet/coreclr中所描述的,我已经尝试了武器库中的任何可能的武器,但没有成功。

\n\n

dotnet团队给出的直接答案是:

\n\n
\n

我们不支持 Unix 上的异​​常处理互操作。没有什么好的办法。Mono 项目在这里有一篇很棒的文章:http://www.mono-project.com/docs/advanced/pinvoke/#runtime-exception-propagation。同样的推理也适用于 .NET Core。

\n
\n\n

Mono项目的解决方案,也是dotnet团队推荐的,是:

\n\n
\n

C++ 异常需要映射到 \xe2\x80\x9cout\xe2\x80\x9d 参数或返回值,以便托管代码可以知道发生了什么错误,并且(可选)向 \xe2\x80 抛出托管异常\x9cpropagate\xe2\x80\x9d 原始 C++ 异常。

\n
\n\n

这就是我们最终实现的,而且,它有效:)。

\n