MSBuild 工具集 (ToolsVersion)

MSBuild 工具集包括 microsoft.common.tasks 文件、 microsoft.common.targets 文件和编译器,例如 csc.exevbc.exe。 大多数工具集可用于将应用程序编译到 .NET Framework 的多个版本和多个系统平台。 但是,MSBuild 2.0 工具集可用于仅面向 .NET Framework 2.0。

Visual Studio 2019 及更高版本中,Project 元素上的 MSBuild ToolsVersion 属性被视为已过时;可以安全地将其删除。 本文介绍其在较旧版本的 MSBuild 或自定义工具集中使用的内容。 请参阅 标准工具集和自定义工具集配置

ToolsVersion 属性

项目文件中 Project 元素的属性中指定工具集ToolsVersion。 以下示例指定应使用 MSBuild“Current”工具集生成项目。

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

注释

某些项目类型使用 sdk 属性而不是 ToolsVersion。 有关详细信息,请参阅 .NET Core 的 csproj 格式的新增内容。

ToolsVersion 属性的工作原理

在 Visual Studio 中创建项目或升级现有项目时,项目文件中自动包含一个名为 ToolsVersion 的属性,其值对应于 Visual Studio 版本中包含的 MSBuild 版本。 有关详细信息,请参阅 框架目标概述

ToolsVersion在项目文件中定义值时,MSBuild 使用该值来确定可用于项目的 Toolset 属性的值。 一个工具集属性是 $(MSBuildToolsPath),它指定 .NET Framework 工具的路径。 只有工具集属性(或 $(MSBuildBinPath))是必需的。

从 Visual Studio 2013 开始,MSBuild 工具集版本与 Visual Studio 版本号相同。 MSBuild 默认为 Visual Studio 和命令行中的此工具集,而不考虑项目文件中指定的工具集版本。 可以使用 -ToolsVersion 标志重写此行为。 有关详细信息,请参阅 Override ToolsVersion 设置

在以下示例中,MSBuild 使用MSBuildToolsPath保留属性查找 Microsoft.CSharp.targets 文件。

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

可以通过定义自定义工具集来修改其值 MSBuildToolsPath 。 有关详细信息,请参阅 “标准”和“自定义工具集”配置

在命令行上生成解决方案并指定 ToolsVersionmsbuild.exe时,即使解决方案中的每个项目都指定自己的ToolsVersion项目,也会根据该ToolsVersion依赖项生成所有项目及其项目到项目依赖项。 若要根据每个项目定义 ToolsVersion 值,请参阅 重写 ToolsVersion 设置

ToolsVersion 属性还用于项目迁移。 例如,如果在 Visual Studio 2010 中打开 Visual Studio 2008 项目,则项目文件将更新为包含 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.exeTlbImp.exe

MSBuild 提供两种方法来访问工具集:

工具集属性指定工具的路径。 从 Visual Studio 2017 开始,MSBuild 不再具有固定位置。 默认情况下,它位于相对于 Visual Studio 安装位置的 MSBuild\15.0\Bin 文件夹中。 在早期版本中,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 以编程方式确定工具集。 此类包括以下方法: