我可以阻止其他AppDomain中的未捕获异常关闭应用程序吗?

时间:2010-10-11 12:44:35

标签: .net exception-handling appdomain finalizer

我遇到了一个错误的库,它会在终结器中抛出一个异常,这当然会导致应用程序崩溃。

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

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

插件托管或使用AppDomains沙箱可能有害的代码的应用程序如何阻止未处理的异常?它实际上是否可能?

注意:我已经有了另一种解决方法,即here。错误的终结器位于一个长期存在的对象上,似乎只在关闭期间收集,因此足以隐藏用户的这种“虚假”错误。尽管如此,我发现这种解决方法很脆弱,因为它会隐藏其他真正的错误,或者如果早些时候收集了对象,则可能会炸毁我的应用程序。

2 个答案:

答案 0 :(得分:4)

AppDomain很不错,因为你可以放弃程序状态,但是你仍然遇到线程已经死的问题。这种情况发生在终结器线程上是致命的,CLR将无需追索中止该过程。

唯一的“修复”是在自己的进程中运行此组件。您可以使用Process.Kill()在头部进行拍摄,以防止终结器线程在进程退出时运行。使用.NET支持的进程间通信机制之一与之交谈。套接字,名为pipe,Remoting或WCF。祝你好运。

答案 1 :(得分:0)

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

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

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