我有一个很大的解决方案(约 450 个项目),其中一些项目一遍又一遍地构建,尽管我没有做任何更改。
当我将构建输出详细程度更改为 diagnostic
时,它说:
Project 'ProjectA' is not up to date. Missing input file 'C:\Src\Project.Core\Bin\Release\ProjectB.dll'
ProjectA
依赖于 ProjectB
并且我正在构建配置 Debug
,那么为什么 Visual Studio 会检查文件 ProjectB。 dll
在 Release
文件夹中? ProjectB.dll
生成并复制到正确的文件夹中(调试)!
每个项目(c# 和 c++)的输出路径都相同:
<OutputPath>$(SolutionDir)Bin\$(Configuration)\</OutputPath>
这只是一个例子。我的解决方案中的多个项目都有这种奇怪的行为。似乎是 C++ 项目导致的,但我没有明确的证据。
这是我对文件访问的 Process Monitor 分析:
更新 1:
ProjectA(C# 项目)使用 ProjectReference
引用 ProjectB(C++ 项目):
<ProjectReference Include="..\..\ProjectB.vcxproj">
<Project>{F2F4C146-8A98-432B-BB9F-A06C4B4162CF}</Project>
<Name>ProjectB</Name>
</ProjectReference>
更新 2:
.NET Core 项目有这个设置:
针对 .NET Framework 的项目是否有类似的东西?
更新 3:
似乎 C# 项目的 FastUpToDateCheck
代码在 csproj.dll
程序集中。由于它是 native 程序集,因此我无法查看代码。真可惜。
最佳答案
问题不是您的所有项目都在解决方案文件 (.sln) 中。
鉴于您正在使用项目引用。即 <ProjectReference
当某些项目位于解决方案文件 (.sln) 中,并且它们引用解决方案文件之外的另一个项目时,MSBuild 将构建另一个项目,但不会使用您正在构建的配置。它总是或通常(一个错误)将使用您正在使用的相反配置构建。
Super Duper 烦人的 bug 顺便说一句。
作为一种变通方法,您可以只声明一个包含所有项目的 ItemGroup,然后直接将其传递给 MSBuild 而根本不使用解决方案。
<ItemGroup>
<Files Include="**\*.csproj" />
<Files Include="**\*.vcxproj" />
</ItemGroup>
<Target Name="Build">
<MSBuild Projects="@(Files)" Properties="Configuration=Debug" />
</Target>
如果他们都使用<ProjectReference
, 然后 MSBuild 将自动确定它们的内置顺序。
或者您可以创建一个包含所有内容的解决方案。
关于c# - Visual Studio 2017 一遍又一遍地构建项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54185133/