Mat*_*cki 8 .net exception-handling appdomain finalizer
我遇到了一个行为不端的库,它在终结器中抛出异常,这当然会导致应用程序崩溃.
为了避免这种情况,我尝试在自己的AppDomain中加载库,但异常仍然会冒泡到表面并导致应用程序崩溃.
正如在MSDN上记录的AppDomain.UnhandledException那样,注册不会阻止异常冒泡,但我很惊讶没有其他方法可以在"子AppDomain"中捕获这样的异常.
插件主机或使用AppDomains的应用程序如何沙箱化可能有害的代码,如何阻止未处理的异常?它实际上可能吗?
注意:我已经有了另一种解决方法,就是这里描述的解决方法.错误的终结器位于一个长期存在的对象上,似乎只在关闭期间收集,因此足以隐藏用户的这种"虚假"错误.尽管如此,我发现这种解决方法很脆弱,因为它会隐藏其他真正的错误,或者如果先前收集了对象,则可能会炸毁我的应用程序.
AppDomain 很好,因为您可以放弃程序状态,但仍然存在线程已死的问题。这种情况发生在终结器线程上是致命的,CLR 将无追索权地中止该进程。
唯一的“修复”是在其自己的进程中运行该组件。您可以使用 Process.Kill() 将其射入头部,以防止终结器线程在进程退出时运行。使用 .NET 支持的进程间通信机制之一与其通信。套接字、命名管道、Remoting 或 WCF。祝你好运。