MVC插件网站,引用相同dll的不同版本

本文关键字:dll 版本 插件 网站 引用 MVC | 更新日期: 2023-09-27 18:08:55

我正在构建一个支持加载模块的网站框架。我用这个样品作为开始。

当所有插件都引用了相同的dll时,它工作得非常好。但这很容易出错。有一天,有人会加载一个使用较新版本dll的插件,然后该网站的某些部分将无法工作。

我必须有以下结构

  • MVC站点
    • 插件A
      • Calc.dll(V1.0(
    • 插件B
      • Calc.dll(v1.1(

我试着让它发挥作用,但进展不顺利。(下面的代码(。当没有在web.config中设置探测专用路径时,尽管我设置了privatebathbin,但它在plugins文件夹中找不到提供的dll。错误表示它拒绝查看。当我在web.config中设置探测属性时,它只加载dll的一个版本,因此一个模块崩溃。这可能是我想要的吗?如果是这样,我的错误是什么?

foreach (var directoryInfo in TempPluginFolder.GetDirectories())
{
     AppDomainSetup setup = new AppDomainSetup();
     setup.ShadowCopyFiles = "true";
     setup.LoaderOptimization = LoaderOptimization.MultiDomain;
     setup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
     setup.PrivateBinPath = directoryInfo.FullName.Replace(setup.ApplicationBase, "''") + ";" + AppDomain.CurrentDomain.SetupInformation.PrivateBinPath.Replace(setup.ApplicationBase, "");

     AppDomain domain = AppDomain.CreateDomain(directoryInfo.FullName, AppDomain.CurrentDomain.Evidence,setup);
     foreach (var fileInfo in directoryInfo.GetFiles("*.dll", SearchOption.TopDirectoryOnly))
     {
         var assemblyName = AssemblyName.GetAssemblyName(fileInfo.FullName);
         domain.Load(assemblyName);
     }
     ReferencePlugins(domain); (<- here I instantiate the plugin)
     AppDomain.Unload(domain);       
 }

MVC插件网站,引用相同dll的不同版本

我看到两(2(个问题可能导致这种情况不起作用:

  1. 第一个问题出现在AppDomain.Load(AssemblyName)状态If a version of the requested assembly is already loaded, this method returns the loaded assembly, even if a different version is requested. 的文档中

  2. 下一个问题包含在对AppDomain.CreateDomain的调用中,该调用状态为o not use this method overload to create sandboxed application domains.,这看起来像是您正在尝试执行的操作

在文档中给出的示例中,对Load的调用表明程序集将加载到调用域以及预期域中。

结账http://msdn.microsoft.com/en-us/library/36az8x58(v=vs.110(.aspx和http://msdn.microsoft.com/en-us/library/aehss7y0(v=vs.110(.aspx