我正在开发一个大型应用程序,它包含许多较小的插件/应用程序.
它们不够大,不足以成为一个完整的进程,但是在一个进程中,它太小而无法在一个线程中运行,而我希望它基于一个插件基础.如果该插件的较新版本可用,则应该卸载,更新并重新启动.
在我寻找解决方案期间,我可以使用魔术字AppDomain,我引用:
"使用应用程序域来隔离可能导致进程失效的任务.如果正在执行任务的AppDomain状态变得不稳定,则可以卸载AppDomain而不会影响进程.当进程必须长时间运行而不重新启动时,这很重要您还可以使用应用程序域来隔离不应共享数据的任务."
因此,这正是我想要的.但是,我猜他们的"状态变得不稳定"与我的观点不同.我正在考虑一个问题,其中一个插件抛出异常,无论出于何种原因.我想抓住,通过电子邮件发送,卸载并重启(如果可能的话).
所以我创建了一个启动的应用程序,查找其文件夹中的所有.dll文件.检查dll是否包含插件.为该插件创建一个新的AppDomain,一旦加载了所有内容,它将启动每个插件.(每个插件可以由多个线程组成,与其他插件紧密共存).
所以我还在那里添加了一个超时,在5秒之后触发抛出一个新的Exception(); 在AppDomain上添加了UnhandledException事件来处理它.但是,它抓住了它,并且在导航之后,仍然"崩溃"了整个过程,包括所有额外的孩子 - AppDomains.
但它在报价中明确指出"隔离"可能"打倒流程"的任务.我错过了一些重要的东西吗?我对报价的看法是错误的吗?
我遇到了一个行为不端的库,它在终结器中抛出异常,这当然会导致应用程序崩溃.
为了避免这种情况,我尝试在自己的AppDomain中加载库,但异常仍然会冒泡到表面并导致应用程序崩溃.
正如在MSDN上记录的AppDomain.UnhandledException那样,注册不会阻止异常冒泡,但我很惊讶没有其他方法可以在"子AppDomain"中捕获这样的异常.
插件主机或使用AppDomains的应用程序如何沙箱化可能有害的代码,如何阻止未处理的异常?它实际上可能吗?
注意:我已经有了另一种解决方法,就是这里描述的解决方法.错误的终结器位于一个长期存在的对象上,似乎只在关闭期间收集,因此足以隐藏用户的这种"虚假"错误.尽管如此,我发现这种解决方法很脆弱,因为它会隐藏其他真正的错误,或者如果先前收集了对象,则可能会炸毁我的应用程序.