C# MSBuild(uBuild)错误地标识以前生成的DLL,并正在重新生成

C# MSBuild(uBuild)错误地标识以前生成的DLL,并正在重新生成,c#,dll,groovy,msbuild,C#,Dll,Groovy,Msbuild,我们有一个包含9个DLL的解决方案,但我已经将这个示例简化为3个库项目 项目1没有依赖项,每次都正确生成。我们从头开始构建,然后将其复制到共享回购 项目2对项目1有一个依赖关系。我们已经准备好了脚本(Groovy),可以将先前编译的DLL(项目1)拉下来,并按照预期使用先前构建的项目1编译项目2。(项目1无重新编译) 如果在此处进行构建,则两个项目都将被标识为: 正在跳过目标“CoreCompile”,因为所有输出文件都是最新的 关于输入文件 项目3依赖于项目2。就地脚本(Groovy)下拉预编

我们有一个包含9个DLL的解决方案,但我已经将这个示例简化为3个库项目

项目1没有依赖项,每次都正确生成。我们从头开始构建,然后将其复制到共享回购

项目2对项目1有一个依赖关系。我们已经准备好了脚本(Groovy),可以将先前编译的DLL(项目1)拉下来,并按照预期使用先前构建的项目1编译项目2。(项目1无重新编译)

如果在此处进行构建,则两个项目都将被标识为:

正在跳过目标“CoreCompile”,因为所有输出文件都是最新的 关于输入文件

项目3依赖于项目2。就地脚本(Groovy)下拉预编译的项目1和项目2

当MSBuild执行检查以确定项目1或项目2是否已更改并需要重建时,项目1的DLL将在不进行其他编译的情况下使用,但每次在生成日志中声明此情况时,项目2都将重建

输入文件“D:\targetFolder\bin\Project1.dll”比输出文件新 文件“obj\Release\Project2.dll”

,并每次继续重建项目2

不确定为什么要将Project 1 DLL与Project 2 DLL进行比较。我想它是在检查时间戳

正在使用csc.exe


在夏洛特中被攻破。

MSBug将考虑一个目标(CyeCeM堆),如果它的输出文件与它的输入文件或文件相同或更旧。您是否已使用诊断记录器运行MS Build以查看用于构建目标的输入?您实际上是在构建sln(解决方案)文件还是手工构建项目?对于项目1和项目2之间的关系,是否使用项目引用或文件\程序集引用?在您的情况下,项目2包含对项目1的引用,这意味着项目1.dll是生成项目2.dll的输入之一。这解释了msbuild比较Project1.dll和Project2.dll时间戳的原因。您应该检查日志——以及在此过程中的自定义生成操作——以查看在将Project1.dll复制到最终目标后是否有任何任务涉及到它。