8

我遇到了一个行为不端的库,它在终结器中引发异常,这当然会使应用程序崩溃。

为了避免这种情况,我尝试将库加载到它自己的 AppDomain 中,但异常仍然浮出水面并使应用程序崩溃。

正如 MSDN 上所记录的,注册到AppDomain.UnhandledException并不能防止异常冒泡,但我很惊讶没有其他方法可以在“子 AppDomain”中捕获此类异常。

插件主机或使用 AppDomain 对可能有害的代码进行沙箱处理的应用程序如何阻止未处理的异常?事实上可能吗?

注意:我已经有另一种解决方法,这里描述的那个。坏的终结器位于一个长期存在的对象上,该对象似乎只在关闭期间被收集,因此向用户隐藏这个“虚假”错误就足够了。不过,我发现这种解决方法很脆弱,因为它要么隐藏其他真正的错误,要么如果早点收集对象,就有可能炸毁我的应用程序。

4

2 回答 2

4

AppDomain 很好,因为您可以放弃程序状态,但仍然存在线程已死的问题。在终结器线程上发生这种情况是致命的,CLR 将在没有追索权的情况下中止进程。

唯一的“修复”是在它自己的进程中运行这个组件。您可以使用 Process.Kill() 在头部射击它,以防止终结器线程在进程退出时运行。使用 .NET 支持的一种进程间通信机制与之对话。套接字、命名管道、Remoting 或 WCF。祝你好运。

于 2010-10-11T13:53:35.480 回答
0

实际上,在 .NET 1.0/1.1 中,它的行为符合您的需要。您仍然可以通过简单地将这一行添加到“运行时”节点内的应用程序配置文件中来恢复此行为:

<runtime>
    <legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>

这将防止不同线程中的未处理异常终止整个进程。

于 2011-05-12T09:52:06.417 回答