C# 捕获从非托管代码引发的致命异常

C# 捕获从非托管代码引发的致命异常,c#,exception,.net-core,C#,Exception,.net Core,目前,没有办法(至少我没有找到办法)用try-catch块捕获致命异常(如堆栈溢出、Segfault等) 我已经在.net核心存储库中开始发布该问题,所以有关更多详细信息,您可以在那里阅读() 我试图做的是,当加载的非托管代码中存在任何segfault/堆栈溢出/任何致命异常时,使应用程序不会崩溃。现在发生的情况是,如果发生任何致命错误,.NET CLR将杀死我的应用程序 例如: 在C托管代码中,通过内核加载库函数加载外部C++ ++代码> DLL 。 假设dll是专门为健壮性测试而创建的,因此

目前,没有办法(至少我没有找到办法)用try-catch块捕获致命异常(如堆栈溢出、Segfault等)

我已经在.net核心存储库中开始发布该问题,所以有关更多详细信息,您可以在那里阅读()

我试图做的是,当加载的非托管代码中存在任何segfault/堆栈溢出/任何致命异常时,使应用程序不会崩溃。现在发生的情况是,如果发生任何致命错误,.NET CLR将杀死我的应用程序

例如: 在C托管代码中,通过内核加载库函数加载外部C++ ++代码> DLL 。 假设
dll
是专门为健壮性测试而创建的,因此当调用特定函数时,它会触发segfault(例如,试图从数组边界之外获取数据)。 发生此错误时,.net CLR会捕获此错误并立即终止调用托管c#代码(应用程序)

我想报告的是这一切的发生,而不是静静地死去。
我做了一些研究,发现上述问题背后有其原因。

这是一个致命的例外。这意味着应用程序处于不可恢复状态。特别是
seg fault
——有东西试图写入无效的内存地址。您不再知道应用程序的内存包含哪些内容,而这些内存是为健壮性测试特意创建的,因此当调用特定函数时,它会触发segfault,因此根本就不健壮。C++有例外,SEG故障绝对不合适。您可以记录这些异常,但一旦应用程序进入如此糟糕的状态,您就无法保持其运行这是库或客户机代码中的错误。库没有抛出异常,而是调用核选项。或者,客户端假定可以以某种方式忽略致命的库错误。seg故障的唯一原因是库错误——库应该确保它不会试图访问任何超出范围的内容。任何人都可以使用疫苗来预防生病(try-catch)。事实上没有疫苗可以防止被流星雨杀死(致命错误),假设这个库是完美的。在这种情况下,SEG故障将来自操作系统本身,因为它检测到有东西试图访问另一个进程的内存,或试图执行数据或其他指示致命情况的东西。在此之后,操作系统将不允许应用程序保持活动状态