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

时间:2012-01-03 18:35:22

标签: msbuild dependencies projects-and-solutions

要点:

使用visual studio和托管C ++和C#项目构建错误的项目

说明

我有一个庞大的(100多个项目)解决方案文件,它以错误的顺序构建了一些项目。解决方案文件包含以下类型的项目:

  • native C / C ++
  • 托管C ++
  • 管理C#

该解决方案包含不同类型项目之间的所有适当依赖关系。好吧,所以当我从命令行(使用MSBuild)构建时,存在问题。托管项目(包括C ++和C#)的依赖关系以错误的顺序构建。例如,项目将无法构建,因为缺少托管依赖项。例如,托管C ++文件将具有失败的使用声明:

#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指令表示。 我在视觉工作室博客上看到,在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 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,但仅限于C#项目。 似乎MsBuild没有使用解决方案文件依赖项。它使用项目文件中的项目引用来创建构建顺序。尝试更新所有ProjectReferences以获得正确的构建顺序。在您的情况下,您必须将托管项目引用(依赖项)添加到C ++项目文件中。

您的问题的答案是:是的,您必须为托管C ++和C#项目执行此操作。如果使用MSBuild构建,则在sln文件中设置依赖关系是不够的。