Набор инструментов 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
элемента Проект в файле проекта. В приведенном ниже примере показано, что сборка проекта должна быть выполнена с помощью набора инструментов MSBuild 15.0 "Текущий".
<Project ToolsVersion="Current" ... </Project>
Примечание.
Некоторые типы проектов используют атрибут sdk
вместо ToolsVersion
. Дополнительные сведения см. в статье Дополнения к формату CSPROJ для .NET Core.
Принцип действия атрибута ToolsVersion
При создании проекта в Visual Studio или обновлении существующего проекта атрибут с именем ToolsVersion
автоматически включается в файл проекта, а его значение соответствует версии MSBuild, включенной в выпуск Visual Studio. Дополнительные сведения см. в статье Общие сведения о настройке для платформы.
Если значение ToolsVersion
определено в файле проекта, MSBuild использует это значение для определения значений свойств набора инструментов, доступных для проекта. Одно из свойств набора инструментов — это $(MSBuildToolsPath)
. Оно определяет путь к инструментам .NET Framework. Обязательным является только это свойство набора инструментов (или $(MSBuildBinPath)
).
Начиная с Visual Studio 2013, версия набора инструментов MSBuild совпадает с номером версии Visual Studio. MSBuild по умолчанию соответствует этому набору инструментов в Visual Studio и в командной строке, независимо от версии набора инструментов, указанной в файле проекта. Это поведение можно изменить с помощью флага -ToolsVersion. Дополнительные сведения см. в статье Переопределение параметров ToolsVersion.
В следующем примере MSBuild находит файл Microsoft.CSharp.targets с помощью зарезервированного свойства MSBuildToolsPath
.
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Значение MSBuildToolsPath
можно изменить, определив пользовательский набор инструментов. Дополнительные сведения см. в статье Стандартные и настраиваемые конфигурации наборов инструментов.
Если вы компилируете решение из командной строки и указываете значение атрибута ToolsVersion
для msbuild.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 автоматически переключаться на набор инструментов в зависимости от контекста, в котором запущено построение. Например, при запуске в Visual Studio 2012 MSBuild использует более новый набор инструментов, чем при запуске в Visual Studio 2010, но при этом не требует изменений в файле проекта.
Реализация набора инструментов
Реализация набора инструментов осуществляется с помощью выбора путей к различным инструментам, целям и задачам, из которых состоит набор инструментов. Инструменты в наборе, которые определяет MSBuild, поступают из следующих источников:
из папки .NET Framework;
из дополнительных управляемых инструментов.
В число управляемых инструментов входят ResGen.exe и TlbImp.exe.
MSBuild предлагает два способа доступа к набору инструментов:
с помощью свойств набора инструментов;
с помощью методов ToolLocationHelper.
Свойства набора инструментов указывают на пути к инструментам. Начиная с Visual Studio 2017, система MSBuild больше не имеет фиксированного расположения. По умолчанию она находится в папке MSBuild\15.0\Bin относительно папки установки Visual Studio. В более ранних версиях MSBuild определяет местоположение соответствующего раздела реестра в соответствии со значением атрибута ToolsVersion
в файле проекта, а затем использует сведения из этого раздела для настройки свойств набора инструментов. Например, если атрибут ToolsVersion
имеет значение 12.0
, то MSBuild задает свойства набора инструментов в соответствии со следующим разделом реестра: HKLM\Software\Microsoft\MSBuild\ToolsVersions\12.0.
Свойства набора инструментов:
MSBuildToolsPath
указывает путь к двоичным файлам MSBuild;SDK40ToolsPath
указывает путь к дополнительным управляемым инструментам для MSBuild 4.x (4.0 или 4.5);SDK35ToolsPath
указывает путь к дополнительным управляемым инструментам для MSBuild 3.5.
Вы также можете программно определить набор инструментов, вызвав методы класса ToolLocationHelper. Класс включает следующие методы:
GetPathToDotNetFramework возвращает путь к папке .NET Framework;
GetPathToDotNetFrameworkFile возвращает путь к файлу в папке .NET Framework;
GetPathToDotNetFrameworkSdk возвращает путь к папке управляемых инструментов;
GetPathToDotNetFrameworkSdkFile возвращает путь к файлу, который обычно находится в папке управляемых инструментов;
GetPathToBuildTools возвращает путь к папке инструментов построения.