在使用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核心托管代码中捕获和处理?
我设置了this Minimal, Complete and Verifiable example,它演示了如何在Linux上通过托管C#.NET核心代码捕获本机异常。
正如the issue I opened for dotnet/coreclr
所描述的那样,我已经尝试过(m)武器库中任何可能的武器,但无济于事。
dotnet团队给出的直接答案是:
我们不支持Unix上的异常处理互操作。没有好办法。 Mono项目在这里有很好的写作:http://www.mono-project.com/docs/advanced/pinvoke/#runtime-exception-propagation。相同的推理适用于.NET Core。
Mono项目的解决方案,也是dotnet团队推荐的解决方案:
需要将C ++异常映射到“out”参数或返回值,以便托管代码可以知道发生了什么错误,并(可选)抛出托管异常以“传播”原始C ++异常。
这就是我们最终实现的,而且,它的工作原理:)。