首先让我说,对于我的场景,插件将在应用启动时加载,并且在应用关闭之前不会被卸载,所以如果我在加载后无法卸载它们就完全可以。
所以我知道如果插件崩溃,将插件加载到他们自己的AppDomain将保护我的应用程序,但假设插件不运行非托管代码,那么我不能只是将调用包装到try / catch块中的插件避免我的应用程序崩溃?或者我在这里遗漏了什么?
我试图使用MAF来做到这一点,但是我遇到了远程处理我的对象的问题。也就是说,在这个时间点,我没有任何可用的选项让它们远程可用。因此,在我切换到更原始的插件架构之前,任何人都可以告诉我,如果我忘记了为什么我应该将插件加载到单独的AppDomain中的任何其他重要原因(或者我是否错误地认为能够简单地避免崩溃在调用时使用try / catch块??
答案 0 :(得分:1)
如果您不需要卸载它们,则不需要单独的AppDomains。
AppDomains不保护进程在未处理的异常情况下被杀死。 new Thread(() => { throw null; }).Start()
仍然致命。
所以你需要try-catch
周围的插件入口点,你需要他们合作(没有线程崩溃)。
但是,如果要中止某些计算,AppDomains非常有用。如果您之后立即卸载整个AppDomain,它们是相对安全地调用Thread.Abort
的一种方式。