包含假程序集定义的VS2012项目总是重建

本文关键字:重建 项目 VS2012 程序集 定义 包含假 | 更新日期: 2023-09-27 18:13:19

最初我们在复杂的解决方案中发现了这个问题,但现在我也可以在虚拟项目中重现它。

如果我在VS2012 premium(更新4)中创建项目,并为其中一个参考添加Fakes汇编,似乎项目将始终重建,无论任何更改。例如,我构建项目,然后再次单击构建按钮将导致重新构建项目。

打开诊断构建信息,似乎问题的根本原因是编译。fakes文件的工具接触了。fakes .dll文件,因此VS认为有些东西发生了变化:

1>Using "Touch" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1>Task "Touch" (TaskId:11)
1>  Task Parameter:
1>      Files=
1>          D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'mscorlib.4.0.0.0.Fakes.dll
1>          D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'System.4.0.0.0.Fakes.dll
1>          D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'mscorlib.4.0.0.0.Fakes.fakesconfig
1>          D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'System.4.0.0.0.Fakes.fakesconfig (TaskId:11)
1>  Touching "D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'mscorlib.4.0.0.0.Fakes.dll". (TaskId:11)
1>  Touching "D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'System.4.0.0.0.Fakes.dll". (TaskId:11)
1>  Touching "D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'mscorlib.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1>  Touching "D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'System.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1>Done executing task "Touch". (TaskId:11)
[...]
1>Input file "D:'work'Ch24_2014_PreEC'UnitTestProject1'FakesAssemblies'System.4.0.0.0.Fakes.dll" is newer than output file "obj'Debug'UnitTestProject1.pdb".

请建议我做错了什么,以及如何解决这个问题,这样项目就不会一直重建冗余。

Thanks in advance

说明一下,下面是重现这个问题的步骤:

  1. 创建您选择的c#项目(我尝试过单元测试和控制台应用程序)
  2. 在一个引用的程序集上添加一个假程序集(我在上面的例子中使用了System)
  3. 构建项目
  4. 重新构建(非重建)

请注意,您不需要在解决方案中添加任何一行代码。

包含假程序集定义的VS2012项目总是重建

尝试编辑visual studio的注册表设置。设置"U2DCheckVerbosity"=dword:00000001[HKEY_CURRENT_USER'Software'Microsoft'VisualStudio'12.0'General]

然后你会在输出中看到,为什么visual studio认为,完全重建是必要的。原始信息在这里

(更新)

vs2017略有变化,说明在这里

要手动更新VS 2017中的"快速最新检查"注册表设置,请执行以下操作:

  • 关闭VS 2017,等待20-30秒,让它释放私有注册表hive。
  • 运行regedit.exe
  • 选择HKEY_LOCAL_MACHINE File -> Load Hive…
  • 转到文件夹%LOCALAPPDATA%'Microsoft'VisualStudio
  • 选择不以Exp
  • 结尾的15.0_*文件夹
  • 选择该文件夹中的privaterregistry .bin文件。例如:C:'Users'MyUserName'AppData'Local'Microsoft'VisualStudio'15.0_4eff8961' privaterregistry .bin
  • 加载Hive的关键名称只需创建一个像VSTweak的名称

hive现在应该显示为HKEY_LOCAL_MACHINE'VSTweak。

  • 编辑(或添加)U2DCheckVerbosity dword(32位)值为1(或0禁用):微软HKEY_LOCAL_MACHINE ' VSTweak ' Software ' ' VisualStudio ' 15.0 _4eff8961 '一般
  • 选择hive根节点(例如,VSTweak)
  • File -> Unload Hive…
  • 确认卸载hive.

获取提示如下问题的消息:项目'Common'不是最新的。错误(0 x8000ffff)。

我一直在经历同样的问题,因为一些引用外部文件:当CopyToOutputDirectory属性被设置为Always时,大量的项目被一遍又一遍地重建,即使没有修改代码。

在VS2013 Update 2中,我不能通过添加假程序集来重现问题,但如果假程序集的CopyToOutputDirectory设置为AlwaysPreserveNewest(即复制如果更新的在VS GUI中),我确实可以重现它。

在你的情况下,我会用文本编辑器仔细检查,如果.csproj包含任何这样的标签:

<Fakes Include="Fakes'mscorlib.fakes">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Fakes>

CopyToOutputDirectory设置为AlwaysPreserveNewest,将它们修改为

<Fakes Include="Fakes'mscorlib.fakes" />

我也遇到过同样的问题。我到目前为止,通过打印出文件及其时间戳,仔细检查了Microsoft.QualityTools.Testing.Fakes.targets中的BuildFakesAssemblies任务的输入/输出,但看不到任何具有较新时间戳的输入,即输出文件的任何时间戳(尽管,我没有检查文件大小,我认为这是是否执行msbuild Target的另一个决定因素)。它是BuildFakesAssemblies任务,它随后会触及测试项目中引用的.fakes.dll文件,这会在实际上没有任何更改时导致不必要的重新编译。

在查看.targets文件时,我注意到2013年版本的microsoft . qualitytools . testing . akes.targets文件中不包含Touch命令。所以,我改变了包含测试项目的。sln文件(格式版本12 -> 13,VS 2012 -> 2013),然后重新触发我的命令行构建,问题不再发生!希望这能帮助到下一个人!