插件AppDomain的解决方法(Plugin AppDomains Workaround)

2019-09-17 20:26发布

当插件组件在自己的子目录处理,还有就是众所周知的问题是,这些组件加载失败,一旦他们试图从他们的子目录加载各自的依赖关系。 一种解决方案是加载插件在应用程序域其中有他们PrivateBinPath在其设定AppDomainSetup在初始化对象。 然而,这导致关于编组/跨AppDomain的沟通,特别是如果插件都应该提供一些GUI等困难。

当安全性方面具有较低的优先级(非关键应用程序,在缺陷造成的插件崩溃没有严重的问题),我有如下想法:在应用程序启动时,所有的插件目录应搜索,以及新AppDomain中应当设立在其bin路径的目录。 然后,整个应用程序及其图形用户界面在新的AppDomain中运行,与所有的插件一起。

在给定的情况下,是否有任何理由,以避免解决方案? 还是有可能,为什么这种解决方案并不可行,甚至任何原因?

Answer 1:

同时考虑到你的描述的情况我不知道你的建议对第二域相关的任何问题。 不过,您也可以探讨通过搜索自己通过加载项子目录,并从那里通过加载组件处理的初始域装配加载失败的可能性Assembly.LoadFrom

一个可能的设置为与例,其中FindAssemblyByName将不得不实施通过所有可能的地点进行搜索:

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    // ...
}

static Assembly CurrentDomain_AssemblyResolve(
    object sender, 
    ResolveEventArgs e)
{
    var assemblyName = new AssemblyName(e.Name);

    string assemblyFilePath = FindAssemblyByName(assemblyName);

    if (string.IsNullOrEmpty(assemblyFilePath))
        return null;

    return Assembly.LoadFrom(assemblyFilePath);
}


文章来源: Plugin AppDomains Workaround