.NET5开启单文件发布后运行提示Newtonsoft.Json文件找不到异常
单文件发布搭配ReadyToRun时Newtonsoft.Json加载异常问题排查
这个问题不是Newtonsoft.Json本身的Bug,是.NET 5单文件发布+ReadyToRun组合场景下的程序集绑定逻辑缺陷,结合Nuget包版本与程序集内置版本不匹配的特性触发的。
核心触发逻辑
- 你引用的Newtonsoft.Json 13.0.1 Nuget包,内置的程序集版本实际是13.0.0.0。Nuget包版本和程序集自身的
AssemblyVersion是两个独立属性,Newtonsoft.Json在大版本内只会升级Nuget包版本,不会修改AssemblyVersion,属于官方惯例设计,不存在你的项目里有13.0.0.0版本引用的问题,报错里的版本号是程序集自带的属性。 - .NET 5的单文件+ReadyToRun组合发布逻辑存在缺陷:生成时会把所有依赖嵌入单文件,但ReadyToRun编译阶段的程序集绑定记录会错误的将同大版本下的Nuget包版本和
AssemblyVersion做错位匹配,运行时加载阶段无法从单文件的嵌入资源中定位到对应绑定记录的程序集,就会抛出FileNotFoundException。 - 环境特异性的原因是:部分设备的全局程序集缓存(GAC)中如果存在Newtonsoft.Json 13.0.0.0版本,运行时会优先加载GAC中的程序集,不会触发报错,只有GAC中没有对应版本的设备才会复现问题,这就是为什么只有特定服务器会出问题。
验证方法
右键点击项目依赖里的Newtonsoft.Json.dll,选择「属性」-「详细信息」,就能看到文件版本是13.0.1.x,而产品版本/程序集版本是13.0.0.0,可直接确认该版本差特性。
可行解决方案
- 方案1:升级到.NET 6及以上版本,微软已经在.NET 6修复了单文件+ReadyToRun场景下的程序集绑定匹配缺陷,同逻辑发布不会再触发该问题。
- 方案2:如果必须使用.NET 5,发布时关闭ReadyToRun选项,仅保留单文件发布配置,程序集绑定逻辑会回退到正常的嵌入资源匹配逻辑,不会报错。
- 方案3:在项目文件中添加显式的程序集绑定重定向配置,强制将所有13.0.0.0版本的请求指向嵌入的对应程序集:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
- 方案4:发布时新增
IncludeAllContentForSelfExtract属性设置为true,强制单文件运行时先解压所有依赖到临时目录再加载,绕过ReadyToRun的绑定匹配逻辑:
<PropertyGroup> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

