再现Newtonsoft.Json程序集版本冲突

时间:2017-06-21 11:56:27

标签: c# json.net

我已经着手在Newtonsoft.Json(与我之前的问题Why is Newtonsoft.Json so prone to assembly version conflicts?相关)中不断重现汇编版本冲突,以便更好地理解它,但我无法触发它。

从最顶层的答案来看,如果我的项目A引用了一个版本的Json.NET,那么它应该会发生,然后它引用一个项目B,它本身引用了一个不同的版本(并且它们没有程序集重定向来处理问题)。

我已经使用类库项目和命令行项目制作了一个解决方案,这两个项目都引用了我用Nuget Package Manager为两个项目安装的Newtonsoft.Json,然后我编辑了类库packages.config以便使用旧版本:

<package id="Newtonsoft.Json" version="6.0.1" targetFramework="net452" />

虽然命令行项目引用了最新版本:

<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net452" />

这不会触发问题,但是,项目仍然成功构建并执行(我只是序列化一个字符串并从两个项目中打印它,我从EXE调用DLL以确保它尝试加载两个版本的Newtonsoft上传.json。

如果需要,我已在https://github.com/sashoalm/ReproduceNewtonsoftJsonBug上传了测试项目。

为什么不会触发错误?

1 个答案:

答案 0 :(得分:6)

首先,尽管packages.json文件说明了 - 您的控制台应用程序引用的是版本6,而不是10:

<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>

但是如果你修复它(例如通过卸载并重新安装包) - 它仍然可以正常工作。这是因为在这种情况下存在自动绑定重定向,请参阅here

  

从Visual Studio 2013开始,以新的桌面应用为目标   .NET Framework 4.5.1使用自动绑定重定向。这意味着   如果两个组件引用相同的不同版本   强命名程序集,运行时自动添加绑定   在输出应用程序中重定向到程序集的较新版本   配置(app.config)文件。

如果查看输出ConsoleApp5.exe.config文件(不是 app.config在Visual Studio中但在Debug \ Release文件夹中) - 您会注意到绑定重定向会自动添加到那里:

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

如果删除它们然后运行目标exe - 它将在运行时失败。

自动绑定重定向由.csproj文件中的属性控制。如果您打开控制台应用程序.csproj,您将看到其中一个PropertyGroup s:

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

如果您将true更改为false - 您将停用此功能,并会看到您尝试重现的警告。