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

时间:2018-07-10 01:47:15

标签: c# .net service clr robustness

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

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

但是我没有找到有关如何操作的详尽信息。

注意: [1]我使用C ++ / CLI混合程序集作为桥接dll将我的本机服务连接到dotnet,而不是使用其COM接口“明确托管CLR”。

1 个答案:

答案 0 :(得分:0)

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

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

但是,我不知道如何在CLR创建的线程上使用__try。也许您可以拦截每个创建的线程并调用C / C ++ /本机代码来设置SEH __except / __try块,然后在refused connection内重新输入CLR? (假设that the interception of the creation of managed threads is even possible)。