插件AppDomains解决方法

时间:2012-06-06 23:28:11

标签: .net plugins appdomain appdomainsetup

在处理自己子目录中的插件程序集时,有一个众所周知的问题,即这些程序集在尝试从子目录加载各自的依赖项时无法加载。解决方案是在AppDomains中加载插件,这些插件在初始化时在PrivateBinPath对象中设置了AppDomainSetup。但是,这会导致编组/跨AppDomain通信的其他困难,特别是如果插件应该提供一些GUI。

当安全方面的优先级较低时(非关键实用程序应用程序,错误插件导致崩溃时没有严重问题),我有以下想法:应用程序启动时,应搜索所有插件目录,并且应该创建一个新的AppDomain,其bin路径中包含这些目录。然后,整个应用程序及其GUI在新的AppDomain中运行,以及所有插件。

在特定情况下,有没有理由避免这种解决方案?或者可能有任何理由说明为什么这个解决方案不可行?

1 个答案:

答案 0 :(得分:1)

考虑到您所描述的方案,我不知道与您的第二个域名的提案相关的任何问题。但是,您也可以通过搜索addins子目录并使用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);
}