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


Набор инструментов MSBuild (ToolsVersion)

Набор инструментов MSBuild включает файл microsoft.common.tasks, файл microsoft.common.targets и компиляторы, такие как csc.exe и vbc.exe. Большинство наборов инструментов можно использовать для компиляции приложений в несколько версий .NET Framework и более одной системной платформы. Однако набор инструментов MSBuild 2.0 можно использовать только для .NET Framework 2.0.

Атрибут MSBuild в элементе Project в Visual Studio и файлах проектов MSBuild ToolsVersion считается устаревшим в Visual Studio 2019 и более поздних версиях. Его можно безопасно удалить. В этой статье описывается его использование в более ранних версиях MSBuild или для пользовательских наборов инструментов. См. стандартные и настраиваемые конфигурации набора инструментов.

Атрибут ToolsVersion

Укажите набор инструментов в ToolsVersion атрибуте элемента Project в файле проекта. В следующем примере указывается, что проект должен быть создан с помощью набора инструментов MSBuild Current.

<Project ToolsVersion="Current" ... </Project>

Замечание

Некоторые типы проектов используют sdk атрибут вместо ToolsVersion. Дополнительные сведения см. в разделе "Дополнения к формату csproj" для .NET Core.

Как работает атрибут ToolsVersion

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

ToolsVersion Если значение определено в файле проекта, MSBuild использует это значение для определения значений свойств набора инструментов, доступных для проекта. Одно свойство Toolset — это $(MSBuildToolsPath)свойство, указывающее путь к средствам .NET Framework. Требуется только это свойство Toolset (или $(MSBuildBinPath)).

Начиная с Visual Studio 2013, версия набора инструментов MSBuild совпадает с номером версии Visual Studio. MSBuild по умолчанию использует этот набор инструментов в Visual Studio и в командной строке независимо от версии набора инструментов, указанной в файле проекта. Это поведение можно переопределить с помощью флага -ToolsVersion. Дополнительные сведения см. в разделе "Переопределение параметров ToolsVersion".

В следующем примере MSBuild находит файл Microsoft.CSharp.targets с помощью зарезервированного MSBuildToolsPath свойства.

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Можно изменить значение MSBuildToolsPath , определив настраиваемый набор инструментов. Дополнительные сведения см. в разделе "Стандартный" и настраиваемых конфигураций набора инструментов.

При сборке решения в командной строке и указании ToolsVersionmsbuild.exe, все проекты и их зависимости проектов и проектов создаются в соответствии с этимToolsVersion, даже если каждый проект в решении указывает свой собственныйToolsVersion. Сведения о определении ToolsVersion значения на основе каждого проекта см. в разделе "Переопределение параметров ToolsVersion".

Атрибут ToolsVersion также используется для миграции проекта. Например, если открыть проект Visual Studio 2008 в Visual Studio 2010, файл проекта обновляется, чтобы включить ToolsVersion="4.0". Если вы попытаетесь открыть этот проект в Visual Studio 2008, он не распознает обновленный ToolsVersion проект и поэтому создает проект, как если бы атрибут по-прежнему был установлен на 3.5.

Visual Studio 2010 и Visual Studio 2012 используют ToolsVersion версии 4.0. Visual Studio 2013 использует ToolsVersion 12.0. Visual Studio 2015 использует ToolsVersion 14.0, а Visual Studio 2017 использует ToolsVersion 15.0. Во многих случаях проект можно открыть в нескольких версиях Visual Studio без изменений. Visual Studio всегда использует правильный набор инструментов, но вы получите уведомление, если используемая версия не соответствует версии в файле проекта. В большинстве случаев это предупреждение является доброкачественным, так как наборы инструментов совместимы в большинстве случаев.

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

Реализация набора инструментов

Реализуйте набор инструментов, выбрав пути различных инструментов, целевых объектов и задач, составляющих набор инструментов. Средства в наборе инструментов, который MSBuild определяет из следующих источников:

  • Папка .NET Framework.

  • Дополнительные управляемые средства.

    Управляемые средства включают ResGen.exe и TlbImp.exe.

MSBuild предоставляет два способа доступа к набору инструментов:

  • С помощью свойств Toolset

  • С помощью ToolLocationHelper методов

Свойства набора инструментов указывают пути средств. Начиная с Visual Studio 2017 MSBuild больше не имеет фиксированного расположения. По умолчанию он находится в папке MSBuild\15.0\Bin относительно расположения установки Visual Studio. В более ранних версиях MSBuild использует значение атрибута ToolsVersion в файле проекта для поиска соответствующего раздела реестра, а затем использует сведения в разделе реестра для задания свойств набора инструментов. Например, если ToolsVersion имеет значение 12.0, MSBuild задает свойства набора инструментов в соответствии с этим разделом реестра: HKLM\Software\Microsoft\MSBuild\ToolsVersions\12.0.

Это свойства Toolset:

  • MSBuildToolsPath указывает путь двоичных файлов MSBuild.

  • SDK40ToolsPath указывает путь к дополнительным управляемым средствам для MSBuild 4.x (это может быть 4.0 или 4.5).

  • SDK35ToolsPath указывает путь к дополнительным управляемым средствам для MSBuild 3.5.

Кроме того, можно программно определить набор инструментов, вызвав методы ToolLocationHelper класса. Класс включает следующие методы: