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

Обновлен: Ноябрь 2007

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

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

При выборе команды Сборка в 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>
ms171468.alert_note(ru-ru,VS.90).gifПримечание.

Некоторые имена наборов элементов являются особыми для 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-редакторе и вручную изменить его. Дополнительные сведения см. в разделе Практическое руководство. Редактирование файлов проекта.

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

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, содержащих спецификацию исходных элементов ссылки.

См. также

Ссылки

Элемент Item (MSBuild)

Элемент Property (MSBuild)

Элемент Target (MSBuild)

Задача Csc

Задача Vbc

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

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