Visual Studio重建未修改的项目

Mat*_*ein 65 c# msbuild ilmerge visual-studio-2010 visual-studio

所以,正如标题所示,我现在有一个VS2010解决方案,里面有大约50个项目.如果我对没有引用的"顶级"项目进行更改,那么VS仍会重建所有50个项目.我正在运行Visual Studio 2010 Ultimate而没有任何附加组件.我正在使用ILMerge将所有项目合并到一个文件中.

我已经通过检查较低级别dll的时间戳来验证这一点,并且看到它们确实已经重建,即使它们的代码没有被触及.

我已阅读所有回复和评论:

Visual Studio 2008不断重建

Visual Studio不断构建一切

奇怪的VS2010构建故障发生在我的解决方案中

C#项目在Visual Studio中重建的原因

但是他们中的大多数只提供卸载项目的建议,以加快构建时间,但没有具体的解决方案.我试图弄清楚为什么VS认为这些依赖项目需要在不修复时进行重建.

我已经打开了'工具>选项>项目和解决方案>构建和运行>仅在运行时构建启动项目和依赖项'但没有任何效果.

此外,如果我只是重建一个只有8个(in)直接依赖项的"中级"项目,那么即使没有调用ILMerge并且没有修改任何依赖项目,它仍会构建所有8个项目.

感谢大家提供的任何见解.

添加

为了测试一些建议,我从头开始创建一个新的WinForms项目.然后我在该解决方案中创建了两个新项目.我将所有代码和资源(不是项目文件)从我的两个"最低级别"项目复制到两个全新的项目中(我通过将资源管理器中的文件和文件夹放到Visual Studio中的项目中来完成此操作).

最低的项目,我们称之为B,没有引用任何其他项目.下一个项目A仅引用了B. 因此,一旦我将所需的.NET和外部程序集引用添加到项目中,那么解决方案就会构建.

然后,我获得了我的新WinForm项目参考A并完成了完整版本.所以ref链是:

WinForm - > A - > B.

然后我修改了WinForm 并进行了标准构建(F6).和以前一样,Visual Studio重建了所有三个项目.

源文件在项目中的某些系统eleminiation后我发现,如果我打消了我Resources.Designer.csResources.resx(并评论指出,利用了的代码.Properties.Resources对这些资源的对象),然后修改的WinForm将不再重建整个解决方案,只会重建WinForm.

添加Resources.resxResources.Designer.cs返回项目B(但保留引用的代码,以便没有任何东西利用资源)将重新引入完整的构建行为.

要查看我的资源文件是否已损坏,我再次删除它们,然后创建一个新文件(通过Project Properties - > Resources)并重新添加与以前相同的资源,这是一个单独的Excel文件.使用此设置,仍将进行完全重建.

然后我删除了单个资源,但将资源文件保留在项目B中.即使没有添加资源,但资源文件仍在项目中,也会发生完全(不需要的)重建.

看起来只是将资源文件添加到(.NET 3.5)项目中将导致Visual Studio 2010始终重建该项目.这是一个错误或预期/预期的行为?

再次感谢所有人!

use*_*954 119

打开工具 - 选项,选择项目和解决方案 - 在树中构建和运行,然后将"MSBuild项目构建输出详细程度"设置为Diagnostic.这将输出构建项目的原因,即

项目'ReferencedProject'不是最新的.项目项"c:\ some.xml"将"复制到输出目录"属性设置为"始终复制".

要么

项目"MyProject"不是最新的.输出文件'c:\ MyProject.pdb'后输入文件'c:\ ReferencedProject.dll'被修改.

在这种情况下,修复是仅在较新时复制some.xml.

构建前事件和后期构建事件也可以触发构建.

  • 我相信这是最好的答案,因为它会让你真正了解导致构建重复的原因,而不仅仅是猜测或试验. (27认同)
  • 我也有同样的问题,但是我将日志记录设置为详细,但它仍然没有输出一行告诉我为什么它认为它已经过时。还有其他方法可以找出这个问题吗? (2认同)

Mat*_*ein 17

虽然我不认为这是一个修复,但这是一个解决方案,适用于我的情况......

我最初在50个项目中有大约5个项目包含一个Resources部分.这些项目将永远重建,因此他们所依赖的任何东西也将被重建.这5个项目中的一个是"基础"级别的库,其他项目中有48个被引用,因此,即使不需要,我的项目的96%也会被重建.

我的解决方法是使用依赖注入,接口和专用的"资源"项目.我没有让这5个项目引用自己的Resources对象,而是在每个项目中创建了一个可以提供所需资源的接口.然后,需要这些资源的类将要求在构造函数(构造函数注入)中创建它们时传入接口.

然后,我创建了一个单独的"资源"项目,其中有一个像normal一样的实际Resources部分.该项目仅包含资源本身,以及通过接口提供这些资源所需的每个接口的类.该项目将引用具有资源依赖性的所有其他项目,并实现项目所需的接口.

最后,在我的"顶级"项目中没有引用任何内容(以及exe实际构建的位置和我的组合根目录)我参考了"资源"项目,连接了DI,然后我们去了.

这意味着每次只重建两个项目("资源"和"顶层"),如果我进行部分构建(Shift-F6),那么它们根本不会重建.

同样,这不是一个很好的工作,但是每次构建需要大约3分钟时就会构建48个项目,所以我每天都会因为不必要的重建而损失30到90分钟.重构需要一段时间,但我认为这是一项很好的投资.

这是一个简化的图表.需要注意的是,从依赖Main.exeProj1Proj2不以减少混乱中.

解决方案图

通过这种设计,我可以构建Proj1Proj2不触发完全重建,因为它们对某个Resources部分没有任何依赖性.只Main知道Resources实施情况.


Yoc*_*mer 16

当项目具有实际不存在的文件时,会发生这种情况.
项目无法确定文件是否已更改(因为它不存在),因此重建.

只需查看项目中的所有文件,然后搜索附近没有可扩展箭头的文件.

  • 如果我有 70 亿个文件怎么办? (2认同)

Mic*_*tov 9

我在VS 2015中遇到了同样的问题.

对我来说诀窍是:

  1. 一个项目在其他一些项目箱中引用自己的副本(魔术,是的).这种东西会从项目层次结构的顶部切换时的诊断生成输出(在构建选项),然后试图建立项目逐一发现 - 如果你看到重建项目,即使什么也没有改变,那么看到它的引用.
  2. 我已将所有项目中的所有"复制始终"文件更改为"如果更新则复制".基本上,在所有.csproj文件中替换<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  3. 然后,我一直在描述禁用NTFS隧道条与此PowerShell脚本:

New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "MaximumTunnelEntries" -Value 0 -PropertyType "DWord"

之后我需要重建,现在似乎有效.


I-A*_*A-N 5

就我而言,罪魁祸首是将引用的 dll 的“复制本地”设置设置为 true,并将文件“复制到输出目录”设置为“始终复制”。