我读到了finalizers at Microsoft并发现了这个有趣的句子:
如果Finalize或者Finalize的覆盖引发异常,那么 运行时不由覆盖默认值的应用程序托管 策略,运行时终止进程,没有活动的try-finally 执行块或终结器。
我已经搜索了如何更改默认策略,但我仍然感到困惑:
微软在关于终结者的链接文章中谈到了哪些政策?我该怎么改变它?我是否可以通过编程方式为当前正在执行的应用程序更改此策略?
注意:并非我想更改它以恢复.NET 1.1终结器行为。我只是好奇。在分析别人的错误时,了解这些细节总是好的。
答案 0 :(得分:3)
当他们讨论时:
运行时不是由覆盖默认策略的应用程序托管的
他们谈论的是一个非托管应用程序,它使用CLR Hosting Interfaces来托管CLR并允许托管代码在其中运行。参见例如SQL Server及其CLR integration。
他们不是在谈论正在运行的托管应用程序可能会发生变化的设置。
请参阅ICLRPolicyManager::SetUnhandledExceptionPolicy
,具体来说:
指定发生未处理的异常时公共语言运行库(CLR)的行为。
和
默认情况下,CLR是所有未处理异常的最终处理程序,其默认行为是拆除进程。主机可以通过将策略值设置为
eHostDeterminedPolicy
来更改此行为。与早期版本的CLR一样,此值允许主机实现其自己的默认行为。