在dotnet核心中捕获本机异常

时间:2018-06-14 06:55:48

标签: c# c++ .net-core interop pinvoke

在使用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核心托管代码中捕获和处理?

1 个答案:

答案 0 :(得分:1)

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

the issue I opened for dotnet/coreclr中所述,我已经尝试过在军械库中使用任何可能的武器,但无济于事。

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

  

我们不支持Unix上的异常处理互操作。没有好的方法。 Mono项目在此处http://www.mono-project.com/docs/advanced/pinvoke/#runtime-exception-propagation上有很多出色的著作。相同的推理适用于.NET Core。

dotnet团队还推荐Mono项目的解决方案:

  

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

这就是我们加强的实现,而且,它很有效:)。