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


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

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

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

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

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

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

Известные имена целевых файлов

При выборе команды Build в 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>
ПримечаниеПримечание

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

Внутрипроцессные компиляторы

Если возможно, Visual Studio будет пытаться использовать внутрипроцессные версии компиляторов Visual Basic или Visual C# для повышения производительности.Чтобы при этом была обеспечена правильная работа, должны быть выполнены следующие условия:

  • Среди целевых объектов проекта должна быть задача под названием Csc (для проектов Visual C#) или Vbc (для проектов Visual Basic)

  • Для параметра UseHostCompilerIfAvailable этой задачи должно быть установлено значение "true".

  • Должны указываться только поддерживаемые значения параметров.Все параметры, указанные в задаче, поддерживаются внутрипроцессным компилятором, однако некоторые значения параметров не поддерживаются.Следующие значения параметра задачи Csc не поддерживаются внутрипроцессным компилятором Visual C#:

    • NoConfig: false и пустые значения не поддерживаются.

    • ResponseFiles: непустые значения не поддерживаются.

    • AdditionalLibPaths: непустые значения не поддерживаются.

    • AddModules: непустые значения не поддерживаются.

    • CodePage: ненулевые значения не поддерживаются.

    • GenerateFullPaths: true не поддерживается.

    • LinkResources: непустые значения не поддерживаются.

Если указанные условия не выполняются, компиляция в проекте будет выполняться путем вызова компилятора с помощью командной строки вместо использования внутрипроцессного компилятора.

Функция IntelliSense в режиме разработки

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

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

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

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

  • Должны удовлетворяться условия, указанные в разделе "Внутрипроцессные компиляторы".

Построение решений

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

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

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

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

<OutputType>WinExe</OutputType>

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

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

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

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

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

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

Условия, накладываемые на элементы и свойства

В процессе построения полностью учитываются все условия.

При определении отображаемого значения свойства те свойства, которые продуктом 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 напрямую, можно открыть файл проекта Visual Studio в редакторе XML.

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

  1. В Обозреватель решений откройте контекстное меню для проекта, а затем выберите Выгрузить проект.

    К проекту добавляется пометка (недоступный).

  2. В Обозреватель решений откройте контекстное меню несуществующего проекта, а затем выберите Изменить <Project File>.

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

  3. Правка, сохранить, а затем закрывает файл проекта.

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

IntelliSense и проверка

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

Типы ядра 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.Каждый из этих элементов должен иметь спецификацию элемента, которая содержит полный путь к ссылке взаимодействия для ссылки СОМ.Эти элементы должны иметь все метаданные, переданные от входных элементов, и, кроме того, новые метаданные с именем CopyLocal, указывающие, следует ли копировать данную сборку в выходную папку, для чего надо присвоить ей значение "true" или "false".

  • Машинные ссылки

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

Ярлыки производительности

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

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

См. также

Задачи

Практическое руководство. Расширение процесса построения Visual Studio

Ссылки

Элемент Item (MSBuild)

Элемент Property (MSBuild)

Элемент Target (MSBuild)

Задача Csc

Задача Vbc

Основные понятия

Запуск построения из интегрированной среды разработки

Регистрация расширений платформы .NET Framework

Другие ресурсы

Основные возможности MSBuild