我正在开发一个大型应用程序,它由许多较小的插件/应用程序组成。
它们不足以成为完整的进程,但又太小而无法在同一个进程的线程下运行,并且我希望它以插件为基础。 如果可用该插件的新版本,则应卸载、更新并重新启动。
在寻找解决方案时,我发现了“应用程序域”这个神奇的词语,我引用一下:
“使用应用程序域来隔离可能会导致进程崩溃的任务。如果正在执行任务的AppDomain的状态变得不稳定,可以卸载该AppDomain而不影响进程。当进程必须长时间运行而无需重启时,这很重要。您还可以使用应用程序域来隔离不应共享数据的任务。”
因此,那正是我想要的。然而,我猜他们所说的“状态变得不稳定”与我的观点不同。我考虑的是一个插件抛出异常的问题,无论出于什么原因。我希望能够捕获、发送电子邮件、卸载和重新启动(如果可能)。
因此,我创建了一个应用程序,启动后搜索其文件夹中的所有.dll文件。检查dll是否由插件组成。为该插件创建一个新的AppDomain,一切都加载完成后,它将启动每个插件。(其中每个插件可以由多个线程组成,相互和谐共存)。
因此,我还添加了一个超时,5秒后会引发新的异常(); 在AppDomain上添加了一个UnhandledException事件来处理它。但是,它捕获了它,并且在捕获之后,仍然“崩溃”整个进程,包括所有额外的子AppDomains。
但是它在引用中明确指出“隔离可能会导致进程崩溃的任务”。那么我是否遗漏了重要的东西?我的观点是否有误?