Резюме:
Проекты создаются в неправильном порядке с 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 #, поскольку их зависимости явны)
Примечание: я пытался поместить это на ВСЕ проекты в моей сборке, и это не сработало так быстро, потому что я получил много странных ошибок сборки в моих нативных проектах ...
Спасибо за любой ответ на этот вопрос.