Visual Studio C# 项目在从调试模式切换到发布模式或者反之后,会强制重新构建。

10
似乎在Visual Studio 2012的C#项目中,每次从Debug切换到Release或反之亦然时都会强制重新生成,即使项目没有发生任何变化。独立项目不会出现这种情况,但如果向类库添加单个项目引用,则每次更改为不同的构建配置时,它就开始表现出这种行为。我已经追踪到了force.build文件(位于obj\Debug或obj\Release中)的生成,每当配置选择更改时就会生成该文件。这是为什么?能否禁用它?我认为切换配置本身不应要求重新生成。我找不到任何有关"force.build"文件和/或如何在任何文档中禁用此"特性"的提及。
要重新创建此问题,请按以下操作:
1. 点击“文件” / “新建项目...” 2. 创建一个新的“Visual C#” ->“控制台应用程序”,将生成的代码保持不变。 3. 在解决方案资源管理器中右键单击新解决方案,然后选择“添加” ->“新建项目...” 4. 选择“Visual C#” -> “类库”。将生成的代码保持不变。 5. 在解决方案资源管理器中右键单击ConsoleApplication1,然后选择“添加引用...” 6. 检查“解决方案” ->“项目”下的ClassLibrary1旁边的框,并单击“确定”。 7. 在“Debug”配置中构建项目。它会按预期进行构建。 8. 切换到“Release”配置并再次构建。它会按预期进行构建。 9. 切换回“Debug”并再次构建。它会“生成”,但不应该。已经构建过,对吧?我们所做的只是更改目标配置选择。
这是一个错误吗?有解决方法吗?

2
你对正在发生的事情误解了。IDE内部有一个额外的层次,可以对构建进行微调优化。当它知道不需要构建时,甚至没有启动MSBuild。这很重要,因为MSBuild会查看很多文件,所以在磁盘较慢的机器上运行速度不快。但是每个微观优化都有其限制,它只是记住上次的构建。实际上没有进行任何构建,MSBuild执行了所有操作,然后报告“1个已更新”并且没有实际改变任何文件。在SSD上只需几分之一秒的时间。这不是bug,你没有真正的问题。 - Hans Passant
2个回答

2
我承认我从来没有太注意过它,但出于好奇,我尝试了一下(Visual Studio 2012更新4)。
像你描述的那样,我尝试了一个单一的项目,切换配置,显然,当我改变配置时,主项目会重新构建:
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

但是,如果我查看输出文件夹,没有任何文件被更新(每个文件的更改时间与之前的构建相同),除了vshost.exe(我已将其禁用,但收到了相同的消息)。然后我尝试将构建日志设置为更详细(工具 - 选项项目和解决方案 - 构建和运行 - MSBuild项目构建输出详细程度 - 从“最小”更改为“正常”或“详细”):

enter image description here

然后我得到了以下的输出:
1>------ Build started: Project: ConsoleApplication1, Configuration: Release Any CPU ------
1>Build started 06/10/2015 00:26:50.
1>GenerateTargetFrameworkMonikerAttribute:
1>Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
1>CoreCompile:
1>Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files.
1>_CopyAppConfigFile:
1>Skipping target "_CopyAppConfigFile" because all output files are up-to-date with respect to the input files.
1>CopyFilesToOutputDirectory:
1>  ConsoleApplication1 -> c:\users\user\documents\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\bin\Release\ConsoleApplication1.exe
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.09
========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

所以似乎每次项目并没有真正地被重建。如果你发现一切都被重建了(检查输出目录文件的修改时间),那么尝试增加构建日志详细程度,就像我描述的那样,看看发生了什么。希望能帮到你。

2
构建过程会再次启动。对于具有耗时的预构建或后构建任务的项目来说,这成为一个真正的问题。似乎在这里没有规定的答案。 - Aaron Hudon

1

谢谢,非常有用的信息。 - Wollmich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接