Nuget错误拉取System.Runtime.CompilerServices.Unsafe版本导致System.Text.Json运行异常
问题解答
疑问1:为什么Nuget安装的System.Runtime.CompilerServices.Unsafe版本和System.Text.Json 5.0.1依赖的版本不一致?
Nuget执行依赖解析时遵循「最近获胜」规则:当多个依赖包共同依赖同一个包时,Nuget会选择所有依赖要求中版本最高的那个进行统一安装。你项目中引入的Grpc 2.41.1、Google.Protobuf 3.19.1这两个包对System.Runtime.CompilerServices.Unsafe的最低版本要求高于4.0.4.1,最终Nuget选择了满足所有依赖要求的最高版本5.0.0.0进行安装,并非安装错误。
疑问2:更高版本的依赖包满足最低版本要求,为什么运行时还会报加载失败?
Nuget包声明的「最低版本兼容」是包管理层面的规则,和.NET运行时的程序集加载规则是两套逻辑:
- System.Text.Json 5.0.1、System.Memory等包编译时引用的是强命名的4.0.4.1版本System.Runtime.CompilerServices.Unsafe,.NET运行时默认对强命名程序集采用严格版本匹配策略,运行时会优先寻找编译时绑定的 exact 版本,找不到就抛出FileNotFoundException。
- 你遇到的异常源是System.Memory,就是System.Memory组件运行时尝试加载4.0.4.1版本的依赖失败导致的,和System.Text.Json本身的兼容性无关。
解决方案
根据你使用的框架版本选择对应处理方式:
- 如果是.NET Framework项目:
手动在App.config/Web.config的节点下添加绑定重定向规则,强制所有版本的该依赖都重定向到你已安装的5.0.0.0版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
也可以右键项目进入属性页,在「生成」 tab 中勾选「自动生成绑定重定向」选项,让VS自动生成对应规则。
- 如果是.NET Core/.NET 5+项目:
该类框架默认自动处理程序集重定向,若出现该错误可在项目文件的节点中添加以下配置,开启自动绑定重定向:
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
- 兜底方案:
直接在项目中显式安装对应版本的System.Runtime.CompilerServices.Unsafe包,Nuget会优先使用你显式指定的版本,再配合绑定重定向即可解决问题。
内容的提问来源于stack exchange,提问作者fofo
相关产品推荐
相关产品推荐

