MSBuild 传递 ProjectReference 的内容未复制到单元测试项目的生成输出

MSBuild transitive ProjectReference's content not copied to build output of unit test project

我有以下(简化的)解决方案结构:

ProjectA
|- Content: myexe.exe with CopyIfNewer

ProjectB
|- ProjRef: ProjectA

ProjectC
|- ProjRef: ProjectB

当我 运行 在构建 ProjectA 的地方构建 ProjectC 时(例如,因为 ProjectA 不是最新的,或者因为我点击了 "Rebuild all")然后 myexe.exe被放入ProjectC的bin输出文件夹。但是,在任何其他情况下,myexe.exe 不在 ProjectC 的 bin 输出文件夹中。

这是已知问题吗?难道我做错了什么?如何解决这个问题?

However, in any other case, myexe.exe is NOT in ProjectC's bin output folder. Is this a known problem? Am I doing something wrong? How to fix this?

测试

首先,我猜测第一个项目是.net framework项目甚至三个项目都是基于framework的。在我这边,我创建了这样三个项目,并引用了你提到的三个项目的关系projects.Exactly,当我修改项目C的代码时(A和B已经构建) ,该文件无法按您的意愿复制到项目 C 中。但是当我只有两个项目 A,B(B 项目 reference:A)时,它总是将第一个项目 A 的文件复制到 B( 每当我选择 Copy always 或 Copy if newer or build or重建项目 B)。此外,我测试了三个基于Net Core或.Net Standard的项目都没有问题。

结论

所以指出这个问题的原因是中间项目项目B没有构建(up-to-date跳过构建 ),所以无法将项目A的文件复制到项目C作为中转站。 (特别是对于非sdk框架项目)。我认为这是 Visual Studio 中项目参考中的一个功能或问题。或者您可以将其报告给 DC Forum 以获取详细说明。

解决方案

你可以在项目B的csproj文件中添加这样的属性来打破最新的检查并确保它始终被构建。您可以在 Debug 或 Release

中将此节点添加到 PropertyGroup 下
 <DisableFastUpToDateCheck> true </DisableFastUpToDateCheck>

希望对您有所帮助。