我已经着手在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 回答
首先,尽管
packages.json
文件说 - 您的控制台应用程序引用的是版本6,而不是10:但是,如果你修复它(例如通过卸载并重新安装包) - 它仍然可以正常工作 . 那是因为在这种情况下有自动绑定重定向,请参阅here:
如果您查看输出
ConsoleApp5.exe.config
文件(不是Visual Studio中的app.config但是在Debug \ Release文件夹中) - 您会注意到绑定重定向会自动添加到那里:如果删除它们然后运行目标exe - 它将在运行时失败 .
自动绑定重定向由.csproj文件中的属性控制 . 如果您打开控制台应用程序.csproj,您将在其中一个
PropertyGroup
中看到:如果您将
true
更改为false
- 您将禁用此功能,并会看到您尝试重现的警告 .