C# MEF中的Dll版本控制

C# MEF中的Dll版本控制,c#,.net,mef,C#,.net,Mef,我有一个使用MEF加载插件的应用程序,它工作得很好。所有插件都引用核心库并导出正确的部分,应用程序加载这些部分时不会出现任何问题 出现的问题与插件库的独立依赖性有关。例如,Ionic.Zip和Newtonsoft.Json。由于在开发这些外部部件时使用了Nugget,不同的插件倾向于引用这些库的不同版本。应用程序甚至可以加载自己的(在Newtonsoft.Json的情况下) 我意识到插件库正在寻找这些库的特定版本,因此在运行某些任务时会抛出错误 有没有一种方法可以在开发过程中指出插件不应该绑定到

我有一个使用MEF加载插件的应用程序,它工作得很好。所有插件都引用核心库并导出正确的部分,应用程序加载这些部分时不会出现任何问题

出现的问题与插件库的独立依赖性有关。例如,Ionic.Zip和Newtonsoft.Json。由于在开发这些外部部件时使用了Nugget,不同的插件倾向于引用这些库的不同版本。应用程序甚至可以加载自己的(在Newtonsoft.Json的情况下)

我意识到插件库正在寻找这些库的特定版本,因此在运行某些任务时会抛出错误

有没有一种方法可以在开发过程中指出插件不应该绑定到库的任何特定版本,这样它就可以只使用加载的任何东西


这样,无论插件链接到哪个版本的Newtonsoft.Json或Ionic.Zip,它只会使用主应用程序加载的版本。

我相信您正在寻找程序集绑定重定向

通过在应用程序的app.config中添加条目,可以为给定程序集创建程序集绑定重定向。下面的示例将所有对myAssembly任何版本的调用重定向到程序集的v3.0.0.0

 <configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
        <!-- Assembly versions can be redirected in app, 
          publisher policy, or machine configuration files. -->
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>


是否尝试连接到AppDomain.AssemblyResolve事件并使用assembly.LoadNo加载程序集。我只是使用
AggregateCatalog
以及
AssemblyCatalog
DirectoryCatalog
从指定的文件夹加载插件。加载插件时不会发生错误。它们装载得很好。假设一个库使用了不同版本的Ionic.Zip,它可以正常加载,但是当我实际调用一个使用Ionic.Zip的方法时,它会抛出一个异常?在我们的解决方案中,我们使用BindingRedirect来解决这些问题。为需要修复的程序集创建assemblybinding,并将所有版本(从0.0.0.0到最新版本)重定向到您拥有的版本。错误通常是无法加载特定版本的库。BindingRedirect应适用于您。这是在加载插件的主应用程序内还是在插件本身内完成?对于主应用程序未知但被插件引用为依赖项的库,情况如何(例如插件1引用NLog vX.Y,插件2引用vX.Z?我观察到的是,由于我们只是复制插件,我们最终只得到了库的一个副本。确切的副本取决于最后复制的是哪一个。加载插件的主应用程序(基本上是exe.config)。您可以尝试将所有依赖程序集的最新版本保留在一个lib文件夹中,并最终将它们复制到目标文件夹中。这很有趣。因此,这意味着主应用程序应该知道所有依赖程序库。我将尝试一下。如果它是一个使用MEF加载其他组件?是。它应适用于所有.Net应用程序