从.NET Framework项目引用.NET Standard DLL时解决NuGet库冲突
解决Newtonsoft.Json跨.NET Standard类库与WPF应用的类型加载冲突问题
兄弟,我之前踩过一模一样的Newtonsoft.Json跨项目版本冲突坑,给你几个亲测有效的解决思路,你挨个试试:
统一所有项目的Newtonsoft.Json版本
这是最核心的一步,不同项目用不同版本的Json库是冲突的根源。你可以:- 打开解决方案的NuGet包管理器,把.NET Standard类库和WPF项目里的Newtonsoft.Json都升级/降级到同一个稳定版本(比如13.0.1,这个版本对.NET Framework 4.6.1+和.NET Standard 2.0+都支持得很好)。
- 更省心的方式是全局控制版本:在解决方案根目录新建
Directory.Build.props文件,写入以下代码,强制所有项目使用指定版本的Newtonsoft.Json:<Project> <PropertyGroup> <NewtonsoftJsonVersion>13.0.1</NewtonsoftJsonVersion> </PropertyGroup> <ItemGroup> <PackageReference Update="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" /> </ItemGroup> </Project>
修复WPF项目的程序集绑定重定向
.NET Framework项目依赖绑定重定向来解决版本冲突,有时候NuGet自动生成的配置会出错。你可以:- 打开WPF项目的
app.config,添加或更新绑定重定向配置:
注意把<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>newVersion改成你实际使用的版本号,Newtonsoft.Json的公钥令牌是固定的30ad4fe6b2a6aeed,别写错。 - 也可以让Visual Studio自动生成正确的重定向:右键WPF项目 → 属性 → 应用程序 → 勾选「自动生成绑定重定向」,然后重新编译项目。
- 打开WPF项目的
清理缓存并全量重建
旧的编译缓存经常会搞事情,按这个步骤来:- 点击Visual Studio顶部的「Build → Clean Solution」清理解决方案。
- 手动删除所有项目的
bin和obj文件夹(可以用资源管理器批量删除,或者写个简单的批处理)。 - 清理NuGet缓存:「工具 → NuGet包管理器 → 包管理器设置 → 清除所有NuGet缓存」。
- 最后点击「Build → Rebuild Solution」全量重建。
排查间接依赖的版本冲突
有时候你的类库可能通过其他NuGet包间接引用了不同版本的Newtonsoft.Json。你可以在NuGet包管理器的「已安装」标签里,查看类库的依赖树,看看有没有其他包依赖了旧版本的Json库。如果有,要么升级那个依赖包到兼容你统一版本的版本,要么在类库的csproj里添加强制版本的配置:<ItemGroup> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> </ItemGroup>用程序集加载日志定位深层问题
如果上面的方法都没用,那就开日志找根因:在WPF项目的app.config里添加日志配置:<configuration> <runtime> <logAssemblyBindings xmlns="urn:schemas-microsoft-com:asm.v1" /> </runtime> </configuration>运行程序后,日志会输出到
%windir%\Microsoft.NET\Framework\v4.0.30319\Config\assemblyBindingLog.xml(根据你的.NET Framework版本调整路径)。打开日志看看Newtonsoft.Json的加载路径和版本,就能知道到底是哪个版本的程序集在搞鬼了。
内容的提问来源于stack exchange,提问作者Eric Johansson
相关产品推荐
相关产品推荐

