VS2012项目包含Fakes组件定义始终重建

时间:2014-07-16 11:14:52

标签: c# visual-studio-2012 microsoft-fakes

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

如果我在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".

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

提前致谢

被修改

为了澄清,以下是重现问题的步骤:

  1. 创建您选择的C#项目(我已经尝试过单元测试和控制台应用程序)
  2. 在其中一个引用的程序集上添加一个Fakes Assembly(我在上面的示例中使用了System)
  3. 构建项目
  4. 再次构建(不重建)
  5. 请注意,您不必向解决方案添加一行代码。

3 个答案:

答案 0 :(得分:1)

尝试编辑visual studio的注册表设置。在"U2DCheckVerbosity"=dword:00000001

设置[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\General]

然后你会在输出中看到为什么visual studio认为必须完全重建。 原始信息为here

[UPDATE]

vs2017的情况略有改变,说明为here

  

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

     
      
  • 关闭VS 2017并等待20-30秒,以释放其私人注册蜂巢。
  •   
  • 运行regedit.exe
  •   
  • 选择HKEY_LOCAL_MACHINE文件 - >加载Hive ......
  •   
  • 转到文件夹%LOCALAPPDATA%\ Microsoft \ VisualStudio
  •   
  • 选择不以Exp
  • 结尾的15.0_ *文件夹   
  • 选择该文件夹中的privateregistry.bin文件。   例如,C:\ Users \ MyUserName \ AppData \ Local \ Microsoft \ VisualStudio \ 15.0_4eff8961 \ privateregistry.bin
  •   
  • 对于Load Hive的密钥名称,只需组成一个名称,如VSTweak
  •   
     

配置单元现在应显示为HKEY_LOCAL_MACHINE \ VSTweak。

     
      
  • 在以下位置编辑(或添加)U2DCheckVerbosity dword(32位)值为1(或0以禁用):   HKEY_LOCAL_MACHINE \ VSTweak \软件\微软\ VisualStudio的\ 15.0_4eff8961 \一般
  •   
  • 选择配置单元根节点(例如,VSTweak)
  •   
  • 文件 - >卸载Hive ......
  •   
  • 确认卸载配置单元。
  •   
  • 启动VS并构建内容。
  •   
     

获取指示问题的消息:项目“Common”不是最新的。错误(0x8000FFFF)。

答案 1 :(得分:0)

由于对外部文件的一些引用,我一直遇到同样的问题:当CopyToOutputDirectory属性设置为Always时,大量项目被反复重建,即使没有对代码进行任何修改。

在VS2013 Update 2中,我无法通过添加假组件来重现该问题,但如果假组件的CopyToOutputDirectory设置为Always或者PreserveNewest,我可以重现它。 <Fakes Include="Fakes\mscorlib.fakes"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Fakes> (即在VS GUI中复制如果更新)。

在你的情况下,我会用文本编辑器仔细检查.csproj是否包含这样的标记:

CopyToOutputDirectory

Always设置为PreserveNewest<Fakes Include="Fakes\mscorlib.fakes" /> ,修改它们

{{1}}

答案 2 :(得分:0)

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

在浏览.targets文件时,我注意到2013版的Microsoft.QualityTools.Testing.Fakes.targets文件中没有包含Touch命令。所以,我更改了包含测试项目的.sln文件(格式版本12 - &gt; 13,VS 2012 - &gt; 2013),然后重新触发我的命令行构建,问题不再发生!希望这有助于下一个人!