MVC插件站点引用了相同dll的不同版本

时间:2014-06-17 15:28:33

标签: c# asp.net-mvc asp.net-mvc-4 dll

我正在建立一个支持模块加载的网站框架。我使用this样本作为开始。

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

我必须有以下结构

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

我试图让它工作,但它并不顺利。 (以下代码)。当没有在web.config中设置探测私有路径时,虽然我设置了privatebathbin但它找不到插件文件夹中提供的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);       
 }

1 个答案:

答案 0 :(得分:0)

我发现两(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. 的文档中说明
  3. 下一个问题包含在对AppDomain.CreateDomain的调用中,该调用表明您正在尝试执行o not use this method overload to create sandboxed application domains.

  4. 对于Load的调用,给出了文档中的示例,表明程序集将被加载到调用域以及目标域中。

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