【发布时间】:2011-08-15 23:25:15
【问题描述】:
我正在开发一个由许多较小的插件/应用程序组成的大型应用程序。
它们不足以成为一个完整的进程,但太小而无法在一个线程中运行,在一个进程下,以及我希望基于插件的基础上拥有它。 如果该插件的更新版本可用,则应将其卸载、更新并重新启动。
在我寻找解决方案的过程中,我可以使用魔法词 AppDomain,并引用:
“使用应用程序域来隔离可能导致 过程。如果正在执行任务的 AppDomain 的状态变为 不稳定,可以卸载AppDomain而不影响进程。 当一个进程必须长时间运行时,这一点很重要 重新启动。您还可以使用应用程序域来隔离任务 不应共享数据。”
因此,这正是我想要的。但是,我猜他们的“状态变得不稳定”与我的观点不同。我正在考虑一个问题,其中一个插件出于某种原因引发异常。我希望它被捕获、通过电子邮件发送、卸载并重新启动(如果可能的话)。
所以我创建了一个启动的应用程序,它会在其文件夹中查找所有 .dll 文件。检查 dll 是否包含插件。为该插件创建一个新的 AppDomain,一旦加载了所有内容,它将启动每个插件。 (每个插件可以由多个线程组成,彼此愉快地共存)。
所以我还在那里添加了一个超时,它会在 5 秒后触发以抛出一个新的 Exception();在 AppDomain 上添加了一个 UnhandledException 事件来处理它。但是,它捕捉到了它,并且在捕捉之后,仍然“崩溃”了整个过程,包括所有额外的子 AppDomain。
但它在引文中明确指出“隔离“可能”导致流程中断的任务”。所以我错过了一些重要的东西吗?我对报价的看法是错误的吗?
【问题讨论】:
-
你看过MEF吗?
-
@Inuyasha 不,我没有,明天我回去工作。
-
你是如何“启动每个插件”的?如果您使用了其中一种创建实例和展开方法,则异常将返回到您需要捕获它的调用域。
-
“太小而不能在线程中运行” 为什么组件的大小会影响这一点?如果它需要多个线程,你可以这样做,不需要为此使用 AppDomains。 (您似乎还有其他使用它们的原因,但我不认为这是一个原因。)
-
@Inuyasha 我只是看了 MEF 和一些例子,它看起来不像我可以用于这个项目的东西。由于每个插件都侦听自己的 Socket 并通过套接字而不是通过“主机”等待数据,因此这里对我们的项目进行更准确的描述:stackoverflow.com/questions/7071995/…(@编辑)