Поделиться через


Интеграция Visual Studio (MSBuild)

Visual Studio размещает MSBuild для загрузки и сборки управляемых проектов. Так как MSBuild отвечает за проект, практически любой проект в формате MSBuild можно успешно использовать в Visual Studio, даже если проект был создан другим средством и имеет настраиваемый процесс сборки.

В этой статье описываются конкретные аспекты размещения MSBuild в Visual Studio, которые следует учитывать при настройке проектов и файлов .targets, которые вы хотите загрузить и собрать в Visual Studio. Это поможет вам убедиться, что функции Visual Studio, такие как IntelliSense и отладка, работают для пользовательского проекта.

Сведения о проектах C++ см. в разделе "Файлы проекта".

Расширения имени файла проекта

MSBuild.exe распознает любое расширение имени файла проекта, соответствующее шаблону .*proj. Однако Visual Studio распознает только подмножество этих расширений имен файлов проекта, которые определяют систему проектов для конкретного языка, которая загрузит проект. В Visual Studio нет системы проектов на основе языка MSBuild.

Например, система проекта C# загружает CSPROJ-файлы , но Visual Studio не может загрузить XXPROJ-файл . Файл проекта для исходных файлов на произвольном языке должен использовать то же расширение, что и файлы проекта Visual Basic или C# для загрузки в Visual Studio.

Кроме того, поддерживается расширение *.msbuildproj.

Известные имена целевых объектов

Щелкнув команду "Сборка" в Visual Studio, будет выполнена цель по умолчанию проекта. Часто этот целевой объект также называется Build. При выборе команды "Перестроить " или "Очистить " будет предпринята попытка выполнить целевой объект с тем же именем в проекте. При нажатии кнопки "Опубликовать" в проекте будет выполнен целевой объект PublishOnly .

Конфигурации и платформы

Конфигурации представлены в проектах MSBuild по свойствам, сгруппированных в элементе PropertyGroup , который содержит Condition атрибут. Visual Studio рассматривает эти условия, чтобы создать список конфигураций проектов и платформ для отображения. Чтобы успешно извлечь этот список, условия должны иметь следующий формат:

Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' " 
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "

Visual Studio рассматривает условия для элементов PropertyGroup, ItemGroup, Import, свойств и элементов для этой цели.

Дополнительные действия сборки

Visual Studio позволяет изменить имя типа элемента файла в проекте с помощью свойства "Действие сборки " окна свойств файла . Имена типов элементов Compile, EmbeddedResource, Content и None всегда отображаются в этом меню, а также любые другие имена типов элементов в проекте. Чтобы убедиться, что имена типов настраиваемых элементов всегда доступны в этом меню, можно добавить имена в тип элемента с именем AvailableItemName. Например, добавление следующего к файлу проекта добавит в это меню пользовательский тип JScript для всех проектов, которые его импортируют.

<ItemGroup>
    <AvailableItemName Include="JScript"/>
</ItemGroup>

Добавление имен типов элементов в AvailableItemName тип элемента приведет к отображению элементов этого типа в обозревателе решений.

Замечание

Некоторые имена типов элементов являются особыми для Visual Studio, но не перечислены в этом раскрывающемся списке.

Компиляторы внутри процесса

По возможности Visual Studio попытается использовать встроенную версию компилятора Visual Basic для повышения производительности. (Неприменимо к C#.) Для правильной работы необходимо выполнить следующие условия:

  • В целевом объекте проекта должна быть задача с именем Vbc для проектов Visual Basic.

  • Параметр UseHostCompilerIfAvailable задачи должен иметь значение true.

IntelliSense на этапе разработки

Чтобы получить поддержку IntelliSense в Visual Studio перед созданием выходной сборки, необходимо выполнить следующие условия:

  • Должен быть целевой объект с именем Compile.

  • Целевой Compile объект или один из его зависимостей должен вызывать задачу компилятора для проекта, например Csc или Vbc.

  • Либо цель Compile, либо одна из её зависимостей должна заставить компилятор получить все необходимые параметры для IntelliSense, в частности, все ссылки.

  • Условия, перечисленные в разделе компиляторов в процессе , должны выполняться.

Создание решений

В Visual Studio файл решения и порядок сборки проекта управляется самой Visual Studio. При создании решения с msbuild.exe в командной строке MSBuild анализирует файл решения и заказывает сборку проекта. В обоих случаях проекты собираются по отдельности в порядке зависимостей, а ссылки между проектами не обрабатываются. В отличие от этого, при создании отдельных проектов с помощью msbuild.exe осуществляется обход ссылок между проектами.

При построении внутри Visual Studio для свойства $(BuildingInsideVisualStudio) задано значение true. Это можно использовать в файлах проекта или целевых , чтобы сборка вела себя по-другому.

Отображение свойств и элементов

Visual Studio распознает определенные имена и значения свойств. Например, следующее свойство в проекте приведет к отображению приложения Windows в поле "Тип приложения " в конструкторе проектов.

<OutputType>WinExe</OutputType>

Значение свойства можно изменить в конструкторе проектов и сохранить в файле проекта. Если такое свойство присваивается недопустимое значение путем ручного редактирования, Visual Studio отобразит предупреждение при загрузке проекта и замените недопустимое значение значением по умолчанию.

Visual Studio понимает значения по умолчанию для некоторых свойств. Эти свойства не будут сохранены в файле проекта, если они не имеют значений по умолчанию.

Свойства с произвольными именами не отображаются в Visual Studio. Чтобы изменить произвольные свойства в Visual Studio, необходимо открыть файл проекта в редакторе XML и изменить их вручную. Дополнительные сведения см. в разделе "Изменение файлов проекта" в Visual Studio далее в этом разделе.

Элементы, определенные в проекте с произвольными именами типов элементов, по умолчанию отображаются в обозревателе решений под их узлом проекта. Чтобы скрыть элемент от отображения, установите значение false для метаданных Visible. Например, следующий элемент будет участвовать в процессе сборки, но не отображаться в обозревателе решений.

<ItemGroup>
    <IntermediateFile Include="cache.temp">
        <Visible>false</Visible>
    </IntermediateFile>
</ItemGroup>

Замечание

Метаданные Visible игнорируются обозревателем решений для проектов C++. Элементы всегда отображаются, даже если Visible задано значение false.

Элементы, объявленные в файлах, импортированных в проект, по умолчанию не отображаются. Элементы, созданные во время процесса сборки, никогда не отображаются в обозревателе решений.

Условия элементов и свойств

Во время сборки все условия полностью уважаются.

При определении значений свойств для отображения свойства, которые Visual Studio считает, что зависит от конфигурации, оцениваются по-разному, чем свойства, которые он рассматривает независимо от конфигурации. Для свойств, которые он считает зависимыми от конфигурации, Visual Studio задает Configuration и Platform свойства соответствующим образом и указывает MSBuild повторно оценить проект. Для свойств, которые он рассматривает независимо от конфигурации, не определено, как будут оцениваться условия.

Условные выражения для элементов всегда игнорируются в целях определения того, должен ли элемент отображаться в обозревателе решений.

Отладка

Чтобы найти и запустить выходную сборку и подключить отладчик, Visual Studio необходимо, чтобы свойства OutputPath, AssemblyName и OutputType были правильно определены. Отладчик не сможет подключиться, если процесс сборки не вызвал компилятора создать PDB-файл .

Выполнение целевого объекта во время разработки

Visual Studio пытается выполнить целевые объекты с определенными именами при загрузке проекта. К этим целевым объектам относятся Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths и CopyRunEnvironmentFiles. Visual Studio запускает эти цели, чтобы компилятор мог быть инициализирован для предоставления IntelliSense, отладчик мог быть инициализирован, а ссылки, отображаемые в обозревателе решений, могли быть разрешены. Если эти целевые объекты отсутствуют, проект будет загружаться и создаваться правильно, но процесс разработки в Visual Studio не будет полностью функциональным.

Изменение файлов проекта в Visual Studio

Чтобы изменить проект MSBuild напрямую, можно открыть файл проекта в редакторе XML Visual Studio.

Выгрузка и изменение файла проекта в Visual Studio

  1. В обозревателе решений щелкните правой кнопкой мыши узел проекта и выберите " Выгрузить проект".

    Проект помечается (недоступно).

  2. В обозревателе решений щелкните правой кнопкой мыши узел недоступного проекта и выберите пункт "Изменить <файл> проекта".

    Файл проекта открывается в редакторе XML Visual Studio.

  3. Измените, сохраните и закройте файл проекта.

  4. В обозревателе решений щелкните правой кнопкой мыши узел недоступного проекта и выберите команду "Перезагрузить проект".

IntelliSense и проверка

При редактировании файлов проекта в редакторе XML работа IntelliSense и проверка зависят от файлов схем MSBuild. Они устанавливаются в кэш схемы, который можно найти в <каталоге> установки Visual Studio\Xml\Schemas\1033\MSBuild.

Основные типы MSBuild определены в Microsoft.Build.Core.xsd и распространенные типы, используемые Visual Studio, определены в Microsoft.Build.CommonTypes.xsd. Чтобы настроить схемы с поддержкой IntelliSense и проверки для имен типов пользовательских элементов, свойств и задач, можно изменить Microsoft.Build.xsd или создать собственную схему, которая включает схемы CommonTypes или Core. Если вы создаете собственную схему, необходимо направить редактор XML, чтобы найти ее с помощью окна Свойств.

Изменение загруженных файлов проекта

Visual Studio кэширует содержимое файлов проекта и файлов, импортированных этими проектами. При изменении загруженного файла проекта Visual Studio автоматически предложит перезагрузить проект, чтобы изменения вступили в силу. Однако если вы редактируете файл, импортированный загруженным проектом, запрос на перезагрузку не будет, и необходимо выгрузить и перезагрузить проект вручную, чтобы внести изменения в силу.

Выходные группы

Несколько целевых объектов, определенных в Microsoft.Common.targets, имеют имена, заканчивающиеся на OutputGroups или OutputGroupDependencies. Visual Studio вызывает эти целевые объекты для получения определенных списков выходных данных проекта. Например, цель SatelliteDllsProjectOutputGroup создает список всех сателлитных сборок, которые будут созданы при сборке. Эти группы вывода используются такими функциями, как публикация, развертывание и ссылки между проектами. Проекты, которые не определяют их, загружают и создаются в Visual Studio, но некоторые функции могут работать неправильно.

Разрешение ссылок

Разрешение ссылок — это процесс использования ссылочных элементов, хранящихся в файле проекта для поиска фактических сборок. Visual Studio должен активировать разрешение ссылок для отображения подробных свойств для каждой ссылки в окне свойств . В следующем списке описываются три типа ссылок и процесс их разрешения.

  • Ссылки на сборки:

    Система проекта вызывает целевой объект с известным именем ResolveAssemblyReferences. Этот целевой объект должен создавать элементы с именем ReferencePathтипа элемента. Каждый из этих элементов должен иметь спецификацию элемента (значение Include атрибута элемента), содержащее полный путь к ссылке. Элементы должны иметь все метаданные из входных элементов, передаваемых в дополнение к следующим новым метаданным:

    • CopyLocal, указывающий, следует ли скопировать сборку в выходную папку, задать значение true или false.

    • OriginalItemSpec, содержащий исходную спецификацию элемента ссылки.

    • ResolvedFrom, установлено в "{TargetFrameworkDirectory}", если оно было разрешено из каталога .NET Framework.

  • Ссылки на COM:

    Система проекта вызывает целевой объект с известным именем ResolveCOMReferences. Этот целевой объект должен создавать элементы с типом элемента с именем ComReferenceWrappers. У каждого из этих элементов должна быть спецификация элемента, содержащая полный путь к сборке взаимодействия для ссылки COM. Элементы должны иметь все метаданные из входных элементов, передаваемых в дополнение к новым метаданным с именем CopyLocal, указывая, следует ли скопировать сборку в выходную папку, задать значение true или false.

  • Собственные ссылки

    Система проекта вызывает целевой объект с известным именем ResolveNativeReferences. Этот целевой объект должен создавать элементы с именем типа NativeReferenceFile. Элементы должны иметь все метаданные из входных элементов, передаваемых в дополнение к новому элементу метаданных с именем OriginalItemSpec, содержащим спецификацию исходного элемента ссылки.

Сочетания клавиш производительности

Если вы используете интегрированную среду разработки Visual Studio для запуска отладки (выбрав клавишу F5 или выбрав Отладка>Начать отладку на панели меню) или для сборки проекта (например, Сборка>Сборка решения), процесс сборки использует быструю проверку изменений для повышения производительности. В некоторых случаях, когда настроенные сборки создают файлы, которые создаются в свою очередь, проверка быстрого обновления неправильно определяет измененные файлы. Проекты, требующие более тщательной проверки обновлений, могут отключить быструю проверку, задав переменную DISABLEFASTUPTODATECHECK=1среды. Кроме того, проекты могут задать это как свойство MSBuild в проекте или в файле импорта проекта.