.NET 4.7.2升级后IdentityModel v3.6.1编译错误求助
我之前也踩过这个版本兼容的坑,咱们来一步步理清楚原因和解决办法:
问题根源
.NET Framework 4.7.2对System.Net.Http的集成逻辑和4.7.1不一样——从4.7.2开始,这个程序集被更深度地整合进框架本身。而你用的IdentityModel v3.6.1是针对旧版.NET编译的,它依赖的是System.Net.Http 4.0.0.0版本。虽然你项目里引用了4.3.3的NuGet包,但编译器和运行时在绑定程序集的时候,会因为4.7.2的框架集成特性,优先寻找系统自带的版本,最终导致版本不匹配,触发CS0012错误。
另外,在.NET 4.7+版本中,NuGet包的System.Net.Http和框架自带的版本本来就容易出现绑定冲突,这算是个常见的版本兼容坑。
可行的解决方法
方法1:添加程序集绑定重定向
这是最直接的解决方案,强制让运行时把对4.0.0.0版本的请求重定向到你项目里引用的4.3.3版本。在项目的App.config(桌面项目)或Web.config(Web项目)中添加以下配置:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.3.3.0" newVersion="4.3.3.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
添加完成后,清理项目并重新生成,一般就能解决这个编译错误。
方法2:升级IdentityModel到兼容版本
IdentityModel v3.6.1是比较老的版本了,后续的v3.x补丁版本以及v4+版本都已经修复了.NET 4.7.2的兼容性问题。你可以打开NuGet包管理器,搜索IdentityModel,选择合适的版本进行更新(如果升级到v4版本,注意部分API有变更,需要调整代码适配)。
方法3:调整System.Net.Http的引用方式
如果上面两种方法都没效果,可以试试:
- 先卸载NuGet中的
System.Net.Http包,然后通过“添加引用-程序集-框架”路径,重新添加.NET Framework自带的System.Net.Http引用。 - 打开项目的
.csproj文件,检查是否存在重复的System.Net.Http引用条目,或者版本冲突的配置,清理掉多余的内容后重新加载项目。
额外提醒
如果是Web项目,还要注意IIS运行环境是否存在程序集版本冲突的情况,但大部分情况下,程序集绑定重定向就能解决这类问题。
内容的提问来源于stack exchange,提问作者fantastischIdee

