如何在托管 CLR 时从 StackOverflowException 中捕获和恢复



我知道从.net2.0开始,StackOverflowException不再可捕获。但是人们提到了托管 CLR 时规则的异常,在这种情况下,可以处理此类异常并从中恢复。

这是有道理的,因为我托管 CLR 以在本机服务中执行托管代码/脚本,并且我不希望草率的脚本代码终止我的服务。相反,我希望能够从此类事件中恢复,并从那时开始将行为异常的脚本代码列入黑名单。

但我没有找到太多关于如何做到这一点的详细说明。

笔记: [1] 我使用 C++/CLI 混合程序集作为桥接 dll 将本机服务连接到 dotnet,而不是使用其 COM 接口"显式托管 CLR"。

我不知道这将在多大程度上适用于.NET Framework(无论是实际自托管还是使用C++/CLI),但请考虑使用Win32的_resetstkoflw()

简而言之 - 您的程序应该在 SEH__except处理程序中调用_resetstkoflw()(这与 C++catch块不同,并且_resetstkoflw()永远不能从C++异常处理程序调用!) - 这假设程序中受影响的线程在进入 CLR 之前在 C/C++/本机代码中启动,而不是 CLR 创建的线程,这是溢出的线程。

但是,我不知道如何在CLR创建的线程上使用_resetstkoflw()。也许您可以拦截每个创建的线程并调用设置 SEH__try/__except块然后重新进入__try中的 CLR 的 C/C++/本机代码?(假设甚至可以拦截托管线程的创建)。