MSBuild /p:BuildProjectReferences=false 导致致命错误 C1192: #using failed

MSBuild /p:BuildProjectReferences=false causes fatal error C1192: #using failed

目前正在尝试使用 MSBuild 代替 devenv 在我们的构建服务器上重新实现我们的构建过程,这样我们就不需要安装完整的 VS IDE。在使用 MSBuild 时遇到了很多问题(竞争条件、跳过共享资源而不是阻塞、父子平台不一致等),我决定在单独的任务中一个一个地构建每个项目,以消除任何并发问题并把/p:BuildProjectReferences=false 在所有任务命令行字段中,以防止 MSBuild 将父项目的平台强加给它们的异构子项目。

然而,当我在 devenv 中将此选项设置为 false 时,MSBuild 会在父级的顶级文件夹中而不是在 bin 中查找依赖项。例如:

项目 B 依赖于项目 A

ProjectA 有 ..\bin\ProjectA.dll 作为输出。

ProjectB 将 ProjectA 引用为 ..\bin\ProjectA.dll

C:\builds\solution\ProjectB\stdafx.cpp:致命错误 C1192:#using 在 'C:\builds\solution\ProjectB\ProjectA.dll'

上失败

为什么 MSBuild 在父项目目录而不是 bin 中检查依赖项输出?解决此问题的选项有哪些?感谢任何见解。

PS.

经过一些工作,我找到了部分答案。对于 C++,我可以通过将相关项目引用上的 Reference Assembly Output 设置为 false 来禁用指向父项目目录的 #using 指令,然后将路径添加到 C++ 和高级下父项目配置中的 Forced #using file 字段.不过,这仅适用于 C++ 项目。仍然不知道如何处理 C# 项目。

似乎 MSBuild 在构建 C# 项目时完全忽略了 /p:BuildProjectReferences=false,然后它尝试将 x86 平台应用于其子项目,包括使用 Win32 平台代替 x86 的 C++ 项目,这在以某种方式导致 MSBuild 寻找它找不到的 v100 (VS 2010) 构建工具。

从那以后,我了解了一些有关 MSBuild 中管理此机制的信息。显然有一个名为 AssignProjectConfiguration 的 MSBuild 任务,它有一个标记为 ShouldUnsetParentConfigurationAndPlatform 的参数。这在 VS 中设置为 true,在 MSBuild 中设置为 false。这似乎是导致 configuration/platform 不匹配的根源。为什么它不顾我明确的命令行指示不构建依赖关系以及为什么 configuration/platform 不匹配导致它寻找 v100 VS 2010 构建工具对我来说都是一个谜。我有大量详细的输出日志要查看。当我继续阅读日志时,我将努力更新它。

因此,在为这个特定问题苦苦挣扎了一周之后,更不用说在过去 4 个月里为整个 MSBuild 相关问题而苦苦挣扎之后,我选择了 devenv。不幸的是,这将无法像我们计划的那样减少我们的足迹。

在我看来,使用任务可以实现实际的解决方案,但学习和试验该框架所需的时间可能令人望而却步。在撰写本文时,我什至不确定如何开始操纵它以模拟 devenv。沉没的人力和时间成本已经太高了,是时候开始工作并继续前进了。

我必须先承认我是我团队的最新成员,但他们似乎比我更困惑,而且他们都是经验丰富的工程师。在他们的辩护中,他们的努力已经集中在其他地方,并且可能比我的花费更好。不过,我学到了很多东西,并开始建立自己的专业领域。

我假设业界对这个问题的回答是为 Azure DevOps 实例向 Microsoft 投入更多现金。我确信 MSBuild 在那里工作得很好。去表明你得到你付出的代价。我们最终可能会到达那里,但除非出现意想不到的突破,否则现在必须这样做。