使用 MSBuild 将 .NET Framework 的特定版本确定为目标
Visual Studio 2008 和 MSBuild 3.5 允许您在创建或生成项目时以多个 .NET Framework 版本(2.0、3.0 和 3.5)为目标。此功能称为“多目标”。 在 MSBuild 中,多目标功能是通过使用 Project 元素 (MSBuild) 中一个名为 ToolsVersion 的新特性来实现的。
工具集、目标 Framework 版本和 ToolsVersion
若要了解 MSBuild 如何与 Visual Studio 2008 一起工作,必须知道工具集与目标 Framework 之间的区别,以及它们各自与 ToolsVersion 新特性之间的关系。这些全部用于确定 MSBuild 3.5 如何生成您的项目。
工具集
工具集是一组搭配在一起的 MSBuild 任务、MSBuild 目标,以及随 MSBuild 和 .NET Framework 一起安装的工具。工具集包括 csc.exe 和 vbc.exe 等编译器、公用目标文件 (microsoft.common.targets) 和公用任务文件 (microsoft.common.tasks)。3.5 工具集可以与目标 .NET Framework 2.0 和 3.0 版一起使用。但是,2.0 工具集只能与目标 .NET Framework 2.0 版一起使用。
Visual Studio 2008 安装 .NET Framework 3.5,它包括两个预定义工具集:一个用于 .NET Framework 2.0,另一个用于 .NET Framework 3.5。没有为随 Windows Vista 提供的 .NET Framework 3.0 定义任何工具集。.NET Framework 2.0 工具集只能将 .NET Framework 2.0 确定为目标,而 .NET Framework 3.5 工具集则可将 2.0、3.0 或 3.5 版本的 .NET Framework 确定为目标。
您也可以创建自己的自定义工具集。有关更多信息,请参见标准和自定义工具集配置。
目标 Framework
目标 Framework 是指您所生成的项目可在其上运行的特定 .NET Framework 版本。确定此版本非常有必要,因为它可使编译器启用该 .NET Framework 2.0 版本所特有的功能,或引用仅在该版本的 Framework 中提供的程序集。
目前,Visual Studio 2008 中有三个 .NET Framework 版本可用:
.NET Framework 2.0(随附于 Visual Studio)。
.NET Framework 3.0(随附于 Windows Vista)。
.NET Framework 3.5(随附于 Visual Studio 2008)。
虽然有三个不同的 .NET Framework 版本,但所有版本都基于 Visual Studio 2005 中所包含的同一基础公共语言运行时 (CLR) 2.0 版。
目标 Framework 版本是在项目文件中通过 TargetFrameworkVersion 属性指定的。当您使用集成开发环境 (IDE) 切换目标 Framework 版本时,Visual Studio 设置此值。(有关更多信息,请参见如何:面向特定的 .NET Framework 版本或配置文件。) TargetFrameworkVersion 的可能值包括 v2.0、v3.0 和 v3.5。它是作为一个 MSBuild 属性来指定的,例如:
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
ToolsVersion 特性
工具集版本可通过项目文件中 Project 元素 (MSBuild) 上的 ToolsVersion 特性来指定。下面的示例指示项目应使用 .NET Framework 2.0 2.0 工具集来生成:
<Project ToolsVersion="2.0" ...</Project>
当在命令行上生成解决方案或项目时,为 msbuild.exe 指定 ToolsVersion 会使所有项目及其项目到项目的依赖项均基于该 ToolsVersion 生成,即便解决方案中的每个项目都在其 Project 元素 (MSBuild) 中指定了其自己的 ToolsVersion 也是如此。
.NET Framework 版本之间的差异
.NET Framework 的所有三个版本都基于 2.0 版的 CLR。不同版本 .NET Framework 的区别在于可它们可提供不同的程序集列表,供您在项目中引用。例如,LINQ 就是 Visual Studio 2008 中包含的一项新技术。 .NET Framework 3.5 是唯一具有 LINQ 相关程序集的 .NET Framework 版本。因此,只有专门将目标版本定为 .NET Framework 3.5,您才能在项目中使用 LINQ。同样,Windows Presentation Foundation (WPF) 是随 Windows Vista 提供的功能。因此,只有将目标版本定为 .NET Framework 3.0 及更高版本的 .NET Framework,您才能在项目中生成 WPF 应用程序。
有关更多信息,请参见标准和自定义工具集配置。
项目如何定位工具集
若要创建项目,Visual Studio 2008 需要工具集。MSBuild 使用 $(MSBuildToolsPath) 属性定位目标和任务。例如,MSBuild 使用下面的 XML 元素查找 Microsoft.CSharp.targets 文件:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Microsoft.CSharp.targets 是 Visual Studio 2008 用来生成 Visual C# 项目的特定于语言的生成过程的示例。$(MSBuildToolsPath) 解析为 .NET Framework 相应版本的路径,即 Microsoft.CSharp.targets 的安装路径(例如,C:\Windows\Microsoft.Net\Framework\v2.0.50727)。
MSBuild 3.5 工具集在生成此项目之前,必须先将 $(MSBuildToolsPath) 解析为 MSBuild 3.5 的安装位置,这样工具集才能导入 Visual Studio 2008 版本的 Microsoft.CSharp.targets。
根据不同的 ToolsVersion,$(MSBuildToolsPath) 会获得不同的值,进而基于 ToolsVersion 值导入不同的工具集。这种灵活的系统使项目、MSBuild 宿主或用户可以指定生成项目时应当使用的工具集,同时还为 MSBuild 指定了一种方法,使其可使用位置信息来选取正确的工具集。
ToolsVersion 特性的工作原理
在 Visual Studio 2008 中创建新项目或升级现有项目时,会在项目文件中自动包含一个名为 ToolsVersion 的特性,并将其默认值设为“3.5”。有关更多信息,请参见面向特定的 .NET Framework 版本或配置文件。
当在项目文件中定义了 ToolsVersion 值时,MSBuild 会使用该值来确定 $(MSBuildToolsPath)(或 $(MSBuildBinPath))的值,即 MSBuild 工具的路径。如果未定义 ToolsVersion 值,MSBuild 会继续使用原来的工具集路径,因为它会假定该项目是一个 Visual Studio 2005 项目。
如果在 Visual Studio 2008 中打开一个现有的 Visual Studio 2005 项目,则该项目实际上会“升级”以包括“ToolsVersion=3.5”,这是因为 Visual Studio 2008 只支持使用 3.5 工具集生成。 因此,当您在 Visual Studio 2008 中生成项目时,它会使用 Visual Studio 2008 工具集 (3.5) 来代替 Visual Studio 工具集 (2.0)。
使用 2.0 工具集创建的项目可以将 .NET Framework 2.0 确定为目标,使用 3.5 工具集创建的项目则可以将 2.0、3.0 或 3.5 版本的 .NET Framework 确定为目标。 即使一个 Visual Studio 项目已迁移至 Visual Studio 2008,并升级为使用 3.5 工具集,其目标 Framework 仍将为 .NET Framework 2.0。这种设计可以保证您在将项目迁移至 Visual Studio 2008 时,不会引入新的依赖项。项目仍将以它在 Visual Studio 中的生成方式继续生成。
备注
如果已在项目中定义了 ToolsVersion,则 Visual Studio 2008 不会更改其值。ToolsVersion 值可被重写。有关更多信息,请参见重写 ToolsVersion 设置。
Visual Studio 2005 与 MSBuild 3.5 的兼容性
Visual Studio 2005 不能打开或生成 Visual Studio 2008 项目或升级至 Visual Studio 2008 的项目。但 MSBuild 2.0 工具集可能能够生成 Visual Studio 2008 项目,前提是您没有使用任何特定于 Visual Studio 2008 工具集的新功能,例如 LINQ、新的 Visual C# 2008 或 Visual Basic 2008 语法功能等等。