我已经着手在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上传了测试项目。
为什么不会触发错误?
答案 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
- 您将停用此功能,并会看到您尝试重现的警告。