使用 MSBuild 以特定的 NET Framework 为目标
更新:2007 年 11 月
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 工具集可与 2.0 和 3.0 目标版本的 .NET Framework 一起使用。而 2.0 工具集则只能与 2.0 目标版本的 .NET Framework 一起使用。
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 属性来指定的。Visual Studio 在您通过集成开发环境 (IDE) 切换目标 Framework 版本时设置此值。(有关更多信息,请参见如何:以特定的 .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 语法功能等等。