Когда использовать <ProjectReference>в файлах проекта? - PullRequest
6 голосов
/ 03 января 2012

Резюме:

Проекты создаются в неправильном порядке с Visual Studio и управляемыми проектами C ++ и C #

Описание:

У меня есть массивный (более 100 проектов) файл решения, который строит несколько проектов в неправильном порядке. Файл решения содержит следующие типы проектов:

  • нативный 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. Я читал в блоге 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 голосов
/ 04 января 2012

У меня была такая же проблема, но только с проектами на C #.Похоже, что MsBuild НЕ использует зависимости файла решения.Он использует ссылки проекта внутри файлов проекта для создания порядка сборки.Попробуйте обновить все ваши ProjectReferences, чтобы получить правильный порядок сборки.В вашем случае вы должны добавить ссылку на управляемый проект (зависимость) в ваш файл проекта C ++.

Ответ на ваш вопрос: Да, вы должны сделать это как для проектов Managed C ++, так и для C #.Установка зависимостей внутри файла sln не достаточна, если вы строите с помощью MSBuild.

...