c# - Visual Studio 2017 一遍又一遍地构建项目

标签 c# c++ visual-studio msbuild

我有一个很大的解决方案(约 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。 dllRelease 文件夹中? ProjectB.dll 生成并复制到正确的文件夹中(调试)!

每个项目(c# 和 c++)的输出路径都相同:

<OutputPath>$(SolutionDir)Bin\$(Configuration)\</OutputPath>

这只是一个例子。我的解决方案中的多个项目都有这种奇怪的行为。似乎是 C++ 项目导致的,但我没有明确的证据。

这是我对文件访问的 Process Monitor 分析:

enter image description here

更新 1:

ProjectA(C# 项目)使用 ProjectReference 引用 ProjectB(C++ 项目):

<ProjectReference Include="..\..\ProjectB.vcxproj">
   <Project>{F2F4C146-8A98-432B-BB9F-A06C4B4162CF}</Project> 
   <Name>ProjectB</Name>
</ProjectReference>

更新 2:

.NET Core 项目有这个设置:

enter image description here

针对 .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/

相关文章:

c++ - 如何使用 STL 集找到第一个小于搜索键的值?

c# - 脚本资源错误 : This is an invalid script resource request

c++ - 将节点插入二叉树时要遵守什么规则?

c++ - STL 容器作为模板参数

c# - 在 Visual Studio 中使用 DTE 的程序包管理器控制台自动化

wpf - 如何手动重新加载 WPF 的 Visual Studio 设计器

c# - CefSharp - 无法启用 webgl

c# - 定义泛型时 new() 的目的是什么?

c# - 从字符串数组中删除项目

visual-studio - 如何在 cmake 中指定 .lib 文件的路径?