更改终结器策略
Posted
技术标签:
【中文标题】更改终结器策略【英文标题】:Changing the finalizer policy 【发布时间】:2014-02-27 14:56:31 【问题描述】:我读到了finalizers at Microsoft,发现了这个有趣的句子:
如果 Finalize 或 Finalize 的覆盖引发异常,并且 运行时不是由覆盖默认值的应用程序托管 策略,运行时终止进程并且没有活动的 try-finally 块或终结器被执行。
我已经用谷歌搜索了如何更改默认策略,但我仍然感到困惑:
他们在谈论Default Security Policy 吗?但我在那里找不到任何与终结器相关的东西。 Cache policy 似乎也不相关 我认为 ASP 密码策略在这里没有帮助Microsoft 在有关终结器的链接文章中谈论的是哪种政策?我怎样才能改变它?我可以为当前正在执行的应用程序以编程方式更改此策略吗?
注意:我不想更改它以恢复 .NET 1.1 终结器行为。我只是好奇。在分析别人的错误时,了解这些细节总是好的。
【问题讨论】:
【参考方案1】:当他们讨论时:
运行时不是由覆盖默认策略的应用程序托管
他们谈论的是使用CLR Hosting Interfaces 托管CLR 并允许托管代码在其中运行的非托管应用程序。参见例如SQL Server 及其CLR integration。
他们不是在谈论正在运行的托管应用程序可以更改的设置。
见ICLRPolicyManager::SetUnhandledExceptionPolicy
,具体来说:
指定发生未处理异常时公共语言运行时 (CLR) 的行为。
和
默认情况下,CLR 是所有未处理异常的最终处理程序,其默认行为是终止进程。主机可以通过将策略值设置为
eHostDeterminedPolicy
来更改此行为。该值允许主机实现其自己的默认行为,就像 CLR 的早期版本一样。
【讨论】:
以上是关于更改终结器策略的主要内容,如果未能解决你的问题,请参考以下文章