在 dotnet core 中捕获本机异常

Posted

技术标签:

【中文标题】在 dotnet core 中捕获本机异常【英文标题】:catch native exception in dotnet core 【发布时间】:2018-06-14 06:55:47 【问题描述】:

在使用 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)

即使外部 c++ 方法的调用被包装在托管代码中的 try catch 块中。

如何在 dotnet 核心托管代码中捕获和处理它?

【问题讨论】:

如果您能提供minimal reproducible example,那就太好了。 注意回复 ***.com/a/151329/613130 。你应该使用try ... catch ... (无异常类型) 请注意,我的问题是指在 linux 上执行的 dotnet 核心,而不是 Windows 上的 dotnet 框架。这仍然是重复的吗? @levhaikin 可能不会…… @levhaikin 你试过没有类型的空白try... catch 吗? 【参考方案1】:

我设置了 this Minimal, Complete and Verifiable example,它演示了如何在 Linux 上由托管 C# .NET Core 代码不捕获任何本机异常。

如the issue I opened for dotnet/coreclr 中所述,我已经尝试过(m)武器库中任何可能的武器,但无济于事。

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

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

同样被dotnet团队推荐的Mono项目的解决方案是:

C++ 异常需要映射到“out”参数或返回值,以便托管代码知道发生了什么错误,并(可选)抛出托管异常以“传播”原始 C++ 异常。

这就是我们最终实施的方法,而且,它确实有效:)。

【讨论】:

以上是关于在 dotnet core 中捕获本机异常的主要内容,如果未能解决你的问题,请参考以下文章

从 c# 捕获本机异常并在它离开范围后获取 exception.what()

什么是_GetExceptionDLLinfo?

SSCE 4 无法从 Outlook 插件加载本机组件异常

JNI - 在执行本机代码期间与目标 VM 断开连接

如何在cfcatch块中检查本机代码错误?

dotnet 教你写一个可以搞炸本机所有 WCF 应用的程序方法