【发布时间】:2012-06-06 23:28:10
【问题描述】:
在处理它们自己的子目录中的插件程序集时,有一个众所周知的问题,即这些程序集一旦尝试从其子目录中加载各自的依赖项,就会无法加载。一种解决方案是在 AppDomains 中加载插件,这些插件在初始化时将其 PrivateBinPath 设置在其 AppDomainSetup 对象中。但是,这会导致有关编组/跨 AppDomain 通信的其他困难,特别是如果插件应该提供一些 GUI。
当安全方面的优先级较低(非关键实用程序应用程序,由于错误插件导致崩溃时没有严重问题),我有以下想法:在应用程序启动时,应搜索所有插件目录,并且应该创建一个新的 AppDomain,在其 bin 路径中包含这些目录。然后,整个应用程序及其 GUI 与所有插件一起在新的 AppDomain 中运行。
在给定的情况下,是否有任何理由避免该解决方案?或者是否有任何原因导致该解决方案甚至不可行?
【问题讨论】:
-
我认为如果你的主 UI 和插件在同一个 AppDomain 中运行,如果插件崩溃,主 UI 很可能会崩溃。您使用的是插件框架还是“RYO”?
-
@IAbstract:即使在另一个 AppDomain 中运行,插件崩溃通常不会导致主 UI 崩溃吗?毕竟,插件中抛出的任何异常都会跨 AppDomain 边界进行编组,并使主应用程序退出,除非我处理异常。在我的特殊情况下,这是 RYO - 我已经研究了 Addin Framework 并阅读了许多关于它的文章,但它们都提到了核心应用程序和插件之间相当简约的接口,而不是我将要介绍的复杂和深度嵌套的对象层次结构需要转移。
标签: .net plugins appdomain appdomainsetup