VS2022中加载System.Net.Http.WebRequestHandler 4.2.0.0及相关问题解决
解决Visual Studio 2022中C#程序集版本不匹配及系统文件保护警告问题
问题背景
使用Visual Studio 2022开发C#项目时,遭遇程序集名称/版本不匹配问题:安装最新版System.Net.Http NuGet包后,仍无法引用4.2.0.0版本的System.Net.Http.WebRequestHandler,仅能使用4.0.0.0版本。
构建安装程序时触发以下警告,提示多个系统保护目录下的程序集应排除,且存在System.Net.Http.dll的多版本打包冲突:
WARNING: 'System.IO.Compression.FileSystem.dll' should be excluded because its source file 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO.Compression.FileSystem\v4.0_4.0.0.0__b77a5c561934e089\System.IO.Compression.FileSystem.dll' is under Windows System File Protection. WARNING: 'System.IO.Compression.dll' should be excluded because its source file 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IO.Compression\v4.0_4.0.0.0__b77a5c561934e089\System.IO.Compression.dll' is under Windows System File Protection. WARNING: 'System.Net.Http.WebRequest.dll' should be excluded because its source file 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http.WebRequest\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.WebRequest.dll' is under Windows System File Protection. WARNING: 'System.Diagnostics.Tracing.dll' should be excluded because its source file 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Diagnostics.Tracing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Diagnostics.Tracing.dll' is under Windows System File Protection. WARNING: 'System.Net.Http.dll' should be excluded because its source file 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll' is under Windows System File Protection.
程序集依赖分析确认存在同名不同版本的DLL冲突,以下是对应疑问的解决方案:
1. 让Visual Studio 2022正确安装并设置程序集版本
- 清理重装NuGet包:
- 右键项目 → 管理NuGet程序包,卸载
System.Net.Http及关联依赖包(如System.Net.Http.WebRequest) - 删除项目根目录下的
packages文件夹,清理残留缓存 - 重新安装对应版本的
System.Net.HttpNuGet包(注意:程序集版本4.2.0.0通常对应NuGet包版本4.3.0及以上)
- 右键项目 → 管理NuGet程序包,卸载
- 手动调整项目引用配置:
编辑项目的.csproj文件,明确指定程序集版本和本地路径:<Reference Include="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <HintPath>..\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath> <Private>True</Private> </Reference> - 启用程序集绑定重定向:
在app.config或web.config中添加重定向规则,将旧版本请求导向目标版本:<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.2.0.0" newVersion="4.2.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
2. 规避“受Windows系统文件保护”的警告
- 排除GAC程序集打包:
在安装项目(如Visual Studio安装项目、WiX)中,将警告列表中的系统程序集设置为不包含在安装包内——这些程序集由系统维护,运行时会自动从GAC加载,无需打包。 - 关闭“复制本地”选项:
右键项目中的系统程序集引用 → 属性,将复制本地设为False,避免编译时将GAC中的DLL复制到输出目录,从根源避免安装程序打包这些文件。 - 强制使用NuGet本地副本:
确保项目引用的是NuGet包目录下的DLL(而非GAC路径),此时安装程序会打包本地副本,不会触发系统文件保护警告。
3. 强制更改程序集的默认版本
- 通过绑定重定向强制版本:
利用上述绑定重定向规则,无论项目引用的原始版本是什么,运行时都会统一使用指定的4.2.0.0版本。 - 手动修改引用版本:
右键程序集引用 → 属性,在版本下拉框中选择目标版本;若列表无对应版本,直接编辑.csproj文件手动指定版本号和HintPath。 - 用日志工具排查冲突:
启动Visual Studio开发者命令提示符中的Fuslogvw.exe,启用程序集绑定日志,查看程序集加载的具体路径和版本,定位冲突来源后针对性调整引用规则。
内容的提问来源于stack exchange,提问作者codenamezero
相关产品推荐
相关产品推荐

