我知道从.net2.0开始,StackOverflowException不再可捕获。但是人们在托管CLR时提到了规则的例外,在这种情况下,可以处理这种例外并从中恢复。
这很有意义,因为我托管CLR以在本机服务中执行托管代码/脚本,并且我不希望草率的脚本代码终止我的服务。相反,我希望能够从此类事件中恢复,并列入黑名单,从这一点上行为不当的脚本代码。
但是我没有找到有关如何操作的详尽信息。
注意:[1]我使用C ++ / CLI混合程序集作为桥接dll将我的本机服务连接到dotnet,而不是使用其COM接口“显式托管CLR”。
我不知道这在.NET Framework中将在多大程度上起作用(无论是自托管还是使用C ++ / CLI,但请考虑使用Win32的_resetstkoflw()
。
总之,您的程序应在SEH _resetstkoflw()
处理程序中调用_resetstkoflw()
(这与C ++ __except
块不同,并且绝对不能从C ++异常处理程序中调用catch
!)-这是假定在进入CLR之前,程序中受影响的线程从C / C ++ /本机代码中开始,而不是成为CLR创建的线程,这就是溢出的线程。
但是,我不知道如何在CLR创建的线程上使用_resetstkoflw()
。也许您可以拦截每个创建的线程并调用C / C ++ /本机代码来设置SEH_resetstkoflw()
/ __try
块,然后在__except
内部重新输入CLR?