如何处理需要不同程序集版本的两个库?

7
我有一个使用第三方库的C# ASP.NET网站,该库依赖于JSON.NET。它作为引用的一部分引入了[Newtonsoft.Json,Version=4.0.5.0]。
昨天,我添加了对不同第三方库的引用,该库依赖于JSON.NET的最新版本。现在我陷入了这样的情况:任何时候只能让其中一个库正常工作。
如果我仅将新引用放入项目中,则对其调用会失败,并出现以下错误提示:
Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0

如果我更新原始库的JSON.NET依赖关系,新代码将正常工作,但对旧库的调用将失败并显示以下信息:

Could not load file or assembly 'Newtonsoft.Json, Version=4.0.5.0

我可以理解第一个失败原因。没错,你需要一个更新的版本。但是第二个就让我疑惑了。在4和9之间没有任何重大更改。应该可以很好地使用新的.dll文件。

无论如何,我现在被这个问题阻塞了。我已经禁用了新代码并删除了引起问题的新库的引用。但我还没有计划如何继续。

有什么想法吗?


1
可能是第三方组件引用同一程序集的不同版本的重复问题。 - user585968
1个回答

14

你需要一个程序集绑定重定向。例如,在你的web.config文件中:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
      <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

基本上意思是 "如果你想使用9之前的任何版本的Newtonsoft.Json,只需加载v9即可。"

这仅适用于Json.NET在版本之间没有进行(许多?)破坏性更改的原因。完整的SemVer规范使用主要版本号表示破坏性更改(并接受这种可能性),我怀疑我们将来会看到更困难的情况......


谢谢。在我的情况下,我也遇到了一个问题,如果配置部分有命名空间(在这里提到:https://dev59.com/e3I-5IYBdhLWcg3wpaB1#12011221),则此部分将被忽略,但这确实解决了问题。 - Jason Kester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接