在dotnet核心中捕获本机异常

问题描述 投票:0回答:1

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

c# c++ .net-core interop pinvoke
1个回答
1
投票

我设置了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 ++异常。

这就是我们最终实现的,而且,它的工作原理:)。

© www.soinside.com 2019 - 2024. All rights reserved.