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

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

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

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

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

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

c# .net service clr robustness
1个回答
0
投票

我不知道这在.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?

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