何时在项目文件中使用<ProjectReference>?

7

概述:

使用Visual Studio建立的100多个项目的方案文件出现了构建错误,其中包含以下项目类型:

  • 本地C/C++
  • 托管C++
  • 托管C#

方案文件包含不同类型项目之间的正确依赖关系。但是,使用MSBuild命令行构建时出现了问题。托管项目(包括C++和C#)的依赖项以错误的顺序构建。例如,由于缺少托管依赖项,某个项目将无法构建。例如,托管C++文件将包含一个using声明,这将导致构建失败:

#using <foo.dll>

由于foo.dll尚不存在。

这意味着应该在之前构建了foo.dll,但实际上并没有。就像我之前提到的那样,依赖关系已经在解决方案文件中正确设置。例如,如果foo依赖于baz,则在解决方案文件中应该有如下设置...

Project("{C4ABA494-43D0-400A-9917-20E167A12CFD}") = "Foo", "...\Foo.vcxproj", "{5A42640E-9E0A-442B-8A40-AA91AD5444AC}"
    ProjectSection(ProjectDependencies) = postProject
        ...
        {2CE32AE0-B129-40BA-B06E-A628FA149AB3} = {2CE32AE0-B129-40BA-B06E-A628FA149AB3}
    EndProjectSection
EndProject
...
Project("{C4ABA494-43D0-400A-9917-20E167A12CFD}") = "baz", "...\baz.csproj", "{2CE32AE0-B129-40BA-B06E-A628FA149AB3}"
    ProjectSection(ProjectDependencies) = postProject
        ...
    EndProjectSection
EndProject

因此,解决方案文件正确地具有依赖项。但是Foo.vcxproj项目中的依赖关系仅通过#using指令表示。我在Visual Studio博客上读到过一个已知的问题,即在msbuild中排序项目时存在错误。http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx 他们的解决方法是将一个名为“”的项添加到我的项目中,如下所示:
<ProjectReference Include="... foo.csproj"> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference>

无论如何,我的问题是:我只需要为我的管理C++项目进行这项工作吗?还是我需要为管理C++和C#项目都做这个操作?(我有点相信我不需要为C#项目执行此操作,因为它们的依赖关系是明确的)
注意:我尝试将此设置应用于构建中的所有项目,但结果不理想,在我的本地项目中出现了许多奇怪的构建错误...
感谢您对此的任何回复。
1个回答

4
我遇到了同样的问题,但只发生在C#项目中。似乎MsBuild没有使用解决方案文件的依赖项。它使用项目文件中的项目引用来创建构建顺序。尝试更新所有的ProjectReferences以获得正确的构建顺序。在您的情况下,您需要将托管项目引用(依赖项)添加到您的C ++项目文件中。
你的问题的答案是:是的,你必须为托管C++和C#项目都这样做。如果你正在使用MSBuild进行构建,仅在sln文件中设置依赖关系是不够的。

我发现如果我添加一个ProjectReference Element来链接本地库,那么我会在MSBuild脚本深处遇到构建错误。所以我已经开始为所有我的Managed C++项目添加ProjectReference,指向其他.csproj文件。现在我将把它们添加到我的.csproj文件中,看看效果如何。 - C.J.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接