VS2017同一解决方案中项目加载不同System.Net.Http DLL问题
关于
System.Net.Http双程序集引用的问题,我来给你拆解清楚 首先解释为什么会出现两个不同的实例:
你遇到的情况其实是.NET Framework官方参考程序集和Visual Studio构建扩展程序集的差异导致的:
- 你的类库项目用的是**.NET Framework 4.6.1自带的官方参考程序集**,路径在
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\,这是框架标准版本,API是最稳定的官方实现。 - 而测试项目的引用来自Visual Studio 2017的MSBuild扩展包,路径在
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.BuildExtensions\net461\lib\——这个是VS为了支持跨框架构建等场景额外提供的版本,和官方参考程序集的API细节有差异,这就是MissingMethodException的元凶。
你猜的没错,“创建单元测试”这个功能确实是诱因:它生成测试项目时,默认会绑定到VS自身的构建扩展程序集,而不是和原类库一致的官方框架引用,自然就出现了版本不匹配。
怎么强制VS统一用同一个程序集?
给你三个实用的解决办法,按推荐程度排序:
1. 直接在csproj里锁死引用路径
修改两个项目的.csproj文件,把System.Net.Http的引用改成明确指向官方参考程序集:
<Reference Include="System.Net.Http"> <HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll</HintPath> </Reference>
这样不管VS怎么默认选,都会强制加载你指定的这个版本,从根源上解决不一致问题。
2. 用绑定重定向让运行时统一版本
如果不想改项目文件,可以在测试项目的app.config里加一段绑定重定向,让运行时自动把所有版本的System.Net.Http都导向你要的那个版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <!-- 这里的oldVersion范围要覆盖可能出现的版本,newVersion改成你类库用的版本 --> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:newVersion要和类库项目里System.Net.Http的版本一致(右键类库的引用看属性就能找到版本号)。
3. 手动替换测试项目的引用
右键测试项目里的System.Net.Http引用→属性,先看版本是不是和类库一致,如果不一致,点击“浏览”,手动导航到官方参考程序集路径(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\)选择System.Net.Http.dll替换掉当前引用,然后把“复制本地”设为True,确保运行时能找到正确的DLL。
内容的提问来源于stack exchange,提问作者splttingatms
相关产品推荐
相关产品推荐

