首页 文章

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

提问于
浏览
5

我已经着手在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 回答

  • 5

    首先,尽管 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 文件(不是Visual Studio中的app.config但是在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 中看到:

    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    

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

相关问题