在处理插件程序集的子目录时,存在一个众所周知的问题,即一旦它们尝试从其子目录加载它们各自的依赖项,这些程序集就无法加载。一种解决方案是在初始化时在AppDomain中加载其PrivateBinPath
设置在它们的AppDomainSetup
对象中的插件。但是,这会导致关于编组/跨AppDomain通信的其他困难,特别是如果插件应该提供一些GUI。插件AppDomains解决方法
当安全性方面的优先级较低(非关键性的实用程序应用程序,由于错误的插件导致崩溃时没有严重问题),我有以下想法:在应用程序启动时,应该搜索所有插件目录,并且应该创建一个新的AppDomain,它的bin路径中包含这些目录。然后,整个应用程序及其GUI在新的AppDomain中运行,以及所有插件。
在特定情况下,是否有任何理由避免该解决方案?或者有什么理由可以解释为什么这个解决方案不可行?
我认为,如果你的主界面在相同的AppDomain作为插件运行,如果插件崩溃,主UI可能会崩溃。你使用插件框架还是“RYO”? – IAbstract
@IAbstract:即使在另一个AppDomain中运行,也不要崩溃插件通常也会导致主UI失败?毕竟,插件中引发的任何异常都会跨AppDomain边界进行编组,并使主应用程序退出,除非我处理异常。在我的特殊情况下,这是RYO - 我研究了Addin框架并阅读了许多关于它的文章,但它们都提到了核心应用程序和插件之间极简主义的界面,而不是复杂和深层嵌套的对象层次结构。需要转移。 –