Здесь есть несколько вещей:
Во-первых, Visual Studio строит немного по-другому - он определяет зависимости проекта, но сборки отдельных проектов могут происходить или не происходить в порядке, определяемом компонентами внутри VS. Система проекта может решить, что проект «обновлен», и полностью пропустить вызов MSBuild для этого проекта.
Вызов командной строки MSBuild для решения может поэтому вести себя немного по-другому, так как все проекты создаются по мере необходимости в не обязательно определенном порядке. Если вы изменили порядок, проекты определены в файле .sln (часть Project… EndProject
), порядок будет другим.
Чтобы применить специальный oder, вы можете использовать зависимости проекта внутри решения, которые ответят на ваш вопрос о том, что вы можете с этим сделать (осторожно: при использовании этой функции были ошибки NuGet).
В вашем случае, основной проект выбирается msbuild для сборки первым.
Поскольку это проект с множественным таргетингом, он будет выделять «внутренние сборки» для каждой целевой инфраструктуры.
Эти внутренние сборки ссылаются на проект "DependencyAfterBuild", который также является проектом с множественным таргетингом. При ссылке на проект с множественным таргетингом в качестве ссылки создается только одна целевая платформа, поэтому msbuild выбирает «ближайшую целевую среду» для зависимости. Вот почему вы видите строку DependencyAfterBuild IsCrossTargetingBuild=
первой (и перед аналогичными строками основного проекта).
После завершения внутренних сборок запускается ваша цель после сборки основного проекта.
Поскольку вы создаете решение, а не только основной проект, также вызывается цель Build для проекта зависимостей, просто потому, что она также находится в решении, которое вы создаете. Поскольку внутренние сборки уже выполнены, они пропускаются, и дополнительные сообщения после сборки не отображаются.
Если вы вручную добавили зависимость проекта или просто отредактировали файл .sln, чтобы изменить порядок определения проектов, вы увидите, что все цели «DependencyAfterBuild» должны быть запущены раньше всех целей основного проекта.