.NET Framework 覆盖自动生成绑定重定向的方法及规则说明
问题背景
构建.NET Framework 4.6.2解决方案时出现如下警告:
The explicit binding redirect on "System.Net.Http, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" conflicts with an autogenerated binding redirect. Consider removing it from the application configuration file or disabling autogenerated binding redirects. The build will replace it with: "<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" xmlns="urn:schemas-microsoft-com:asm.v1" />"
业务场景要求使用System.Net.Http 4.1.1.3版本,使用4.2.0.0版本时创建HttpClient实例会抛出如下运行时异常:
Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies
已在App.config中显式配置4.1.1.3版本的绑定规则,但受AutoGenerateBindingRedirects标志影响,程序集始终被重定向到4.2.0.0版本,显式配置不生效。
问题1:覆盖自动生成绑定重定向的操作方法
可以覆盖,有两种经过验证的可行方案,按需选择即可:
- 方案1:直接关闭项目的自动绑定重定向生成功能
右键点击对应项目选择「卸载项目」,编辑.csproj项目文件,在第一个<PropertyGroup>节点下添加如下配置,重新加载项目后重新生成即可:
该配置关闭后,生成过程不会自动修改输出目录下的配置文件,你在App.config中手动编写的所有绑定重定向规则会原样生效。注意关闭后如果其他依赖包存在版本冲突,需要手动补全对应的绑定重定向规则,避免运行时出现程序集加载失败。<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects> - 方案2:保留自动生成功能,强制指定本地复制的目标版本
如果不想完全关闭自动生成,可以在添加上述AutoGenerateBindingRedirects配置的基础上,补充配置<GenerateBindingRedirectsOutputType>false</GenerateBindingRedirectsOutputType>,同时将引用的System.Net.Http4.1.1.3版本DLL设置为本地复制:在解决方案资源管理器中找到引用的System.Net.Http,右键打开属性面板,将「复制本地」设置为True。
额外注意:需要确认解决方案下所有项目引用的System.Net.Http版本都统一为4.1.1.3,不要存在部分项目引用GAC全局版本、部分引用NuGet版本的情况,否则生成过程还是会优先识别高版本引用,导致重定向规则不符合预期。
问题2:AutoGenerateBindingRedirects的版本判定逻辑
自动绑定重定向的目标版本判定核心规则如下:
- 生成过程会全量扫描项目的完整依赖链,包括项目直接引用、所有NuGet包的间接依赖、框架自带的程序集引用,统计每个强命名程序集所有被引用的版本号。
- 对同一个程序集的多个引用版本,自动选择依赖链中出现的最高版本号作为重定向的目标版本,生成
oldVersion="0.0.0.0-[最高版本号]" newVersion="[最高版本号]"的统一重定向规则,目的是避免不同依赖引用不同版本导致的加载冲突。 System.Net.Http被重定向到4.2.0.0的核心原因是:.NET Framework 4.6.2的全局程序集缓存(GAC)中自带的System.Net.Http程序集版本就是4.2.0.0,只要项目有任意一个依赖(包括框架本身的System.Web、System.Net等基础类库)引用了GAC中的4.2.0.0版本,自动生成逻辑识别到这个版本比NuGet安装的4.1.1.3更高,就会自动把重定向目标设为4.2.0.0,覆盖手动写的低版本重定向规则。
内容的提问来源于stack exchange,提问作者Amit Kumar
相关产品推荐
相关产品推荐

