You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Fakes的GENERATEFAKES偶发CS1705编译错误求助

解决Microsoft Fakes构建偶发失败:System.ValueTuple版本冲突问题

问题背景

  • 偶发构建失败,重建大多可恢复;错误提示某程序集引用的System.ValueTuple, Version=4.0.3.0高于被引用的4.0.2.0,导致GENERATEFAKES编译失败(退出码1)
  • 输出窗口存在MSB3277警告,明确版本冲突后系统选择了4.0.2.0版本
  • 环境:VS 2022(17.1.6),解决方案包含net462传统Package Reference项目、SDK样式项目,部分依赖Asp.net core 2.1,单元测试使用Microsoft Fakes + MS-Test
  • 排查细节:所有项目NuGet引用均指向System.ValueTuple 4.5.0(对应程序集版本4.0.3.0),但间接依赖Microsoft.CodeAnalysis.Common 2.8.0要求System.ValueTuple 4.3.0(对应程序集版本4.0.2.0);自动生成的f.csproj中HintPath指向正确版本,但Fake程序集的obj目录仅存在4.0.2.0版本

已尝试无效的方法

  • 清理所有bin/obj目录、NuGet缓存后重建
  • 在单元测试项目及.fakes文件中设置AutoGenerateBindingRedirects和GenerateBindingRedirectsOutputType为True
  • 尝试Stack Overflow上的常规解决方案

可行解决方案

1. 全局强制统一System.ValueTuple版本

在解决方案根目录新建或修改Directory.Build.props文件,添加以下配置,强制所有项目使用指定版本的System.ValueTuple,覆盖间接依赖的版本要求:

<Project>
  <ItemGroup>
    <PackageReference Include="System.ValueTuple" Version="4.5.0" PrivateAssets="All" />
  </ItemGroup>
</Project>

该文件会被解决方案内所有项目自动继承,确保版本统一。

2. 手动修正Fake项目的程序集引用

找到单元测试项目下自动生成的f.csproj文件(路径通常为[测试项目目录]\Fakes\[目标程序集名]\f.csproj),手动修改System.ValueTuple的引用节点,明确指定程序集版本和正确的HintPath:

<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
  <HintPath>$(NuGetPackageRoot)\system.valuetuple\4.5.0\lib\net461\System.ValueTuple.dll</HintPath>
  <Private>True</Private>
</Reference>

注意:由于f.csproj是自动生成的,重新生成Fakes时可能被覆盖,可考虑通过自定义MSBuild目标自动执行修改操作。

3. 升级间接依赖包

查找解决方案中引用Microsoft.CodeAnalysis.Common 2.8.0的上游包,升级该包到最新兼容版本,间接带动依赖的Microsoft.CodeAnalysis.Common版本升级,新版本通常已兼容System.ValueTuple 4.5.0。

4. 手动添加绑定重定向到测试项目

在单元测试项目的app.config中添加绑定重定向配置,强制所有对System.ValueTuple的引用指向4.0.3.0版本:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

同时确保测试项目的.csproj文件中保留以下配置:

<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>

内容的提问来源于stack exchange,提问作者donttellya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:15:40