MSBuild 多目标功能

更新:2010 年 8 月

通过 Visual Studio,您可以将应用程序编译为在若干 .NET Framework 版本的任意一个上运行。 例如,可以将同一个应用程序编译为既能在 .NET Framework 2.0 版上运行,也能在 .NET Framework 4 版上运行。 这种使用多个框架作为编译目标的能力称为“多目标功能”。

提示

Visual Studio 在开发计算机上安装的最新 .NET Framework 版本下运行。

以下是多目标功能的一些优点:

  • 可以开发以多个 .NET Framework 早期版本(例如,版本 2.0、3.0 和 3.5)为目标的应用程序。

  • 可以以 .NET Framework 之外的框架为目标,例如,Silverlight Framework。

  • 可以以一个框架配置文件为目标,该文件是目标框架的预定义子集。

  • 如果发布了 .NET Framework 版本 4 的任何 Service Pack,则可以以它们为目标。

  • 多目标功能保证应用程序仅使用目标框架中提供的功能。

目标框架是您生成的项目要在其上运行的特定 .NET Framework 版本。 确定此版本非常有必要,因为它可使编译器启用该 .NET Framework 2.0 版本所特有的功能,或引用仅在该版本的 Framework 中提供的程序集。

以特定框架为目标来编译应用程序时,必须协调以下三组软件组件:

  • 工具集,包含用于创建应用程序的编译器、任务和目标。

  • 引用程序集,用于设计和生成应用程序。

  • 运行时程序集,用于运行应用程序。

工具集 (ToolsVersion)

工具集是随 MSBuild 和 .NET Framework 安装的一组匹配的 MSBuild 任务、MSBuild 目标和工具。 工具集包括编译器(如 csc.exe 和 vbc.exe)、常用目标文件 (microsoft.common.targets) 和常用任务文件 (microsoft.common.tasks)。 4.0 工具集可用于面向 .NET Framework 版本 2.0、3.0、3.5 和 4。 但是,2.0 工具集仅可用于面向 .NET Framework 版本 2.0。

例如,可以通过设置项目文件的 Project 元素的 ToolsVersion 特性来指定工具集。

<Project ToolsVersion="4.0" ...

可以使用版本 4.0 工具集来编译应用程序,以便在各种目标框架上运行,前提是已为要面向的每个框架安装目标包。 有关更多信息,请参见本主题后面的“目标包”。

您也可以创建自己的自定义工具集。 有关更多信息,请参见标准和自定义工具集配置

提示

Visual Studio 不包括用于更改工具集的用户界面。

引用程序集

通常,框架已关联引用程序集。 引用程序集是一个简化的程序集,它没有代码且仅公开公共类型和成员。

在设计时和生成时,Visual Studio 将使用目标框架的引用程序集作为筛选器,以便只有与目标框架兼容的类型和成员才可用。 例如,当您以 .NET Framework 版本 3.5 为目标时,仅由 .NET Framework 版本 4 提供的类型和成员在 Visual Studio 设计器(例如,**“添加引用”对话框的“.NET”**选项卡)中不会显示,并且不可用于生成过程。

例如,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 应用程序。

目标包

在安装了对应的目标包之后便可使用引用程序集。 目标包包含引用程序集和一个列出这些程序集的 FrameworkList.xml 文件。 FrameworkList.xml 文件也称为再发行 (redist) 列表。

目标包可从以下源中获得:

  • .NET Framework 版本 2.0、3.0 和 3.5 的目标包包含在 .NET Framework 版本 3.5 SP1 中。

  • .NET Framework 3.5 版 Client Profile、.NET Framework 4 版、.NET Framework 4 版 Client Profile 和 Silverlight 的目标包包含在 Visual Studio 中。

通常,目标包安装在 .. \Program Files (x86)\Reference Assemblies\Microsoft\Framework\ 文件夹中。 .NET Framework 版本 2.0 的目标包通常安装在 .. \Windows\Microsoft.NET\Framework\v2.0.50727\ 文件夹中。

当您在命令行中生成解决方案或项目时,即使解决方案中的每个项目均在其 Project 元素 (MSBuild) 中指定自己的 ToolsVersion 特性,为 msbuild.exe 指定 ToolsVersion 特性也会导致根据这些工具版本生成所有项目及其项目间依赖项。

运行时程序集

在 Visual Studio 中,需要先安装目标框架的目标包,然后才能设置该目标框架。 例如,若要以 .NET Framework 版本 3.0 为目标,必须安装其引用程序集和兼容程序集。 在运行时,公共语言运行时 (CLR) 合成加载程序将应用程序绑定到其面向的框架的运行时程序集。

选择目标框架

为现有项目选择目标框架

  1. 在**“解决方案资源管理器”中右击项目节点,然后单击“属性”**。

  2. 在**“应用程序”选项卡的“目标框架”**列表中,选择一个框架。 此列表中仅显示安装了目标包的框架。

    Visual Studio 将使用您的选择来设置项目文件中以下三个元素的值:

    • TargetFrameworkIdentifier 元素命名目标框架,例如:

      <TargetFrameworkIdentifier>Silverlight</TargetFrameworkIdentifier>

      如果缺少此元素,将采用默认的目标框架值“.NETFramework”。

    • TargetFrameworkVersion 元素命名目标框架版本,例如:

      <TargetFrameworkVersion>v3.0</TargetFrameworkVersion>

    • TargetFrameworkProfile 元素命名目标框架配置文件,例如:

      <TargetFrameworkProfile>Client</TargetFrameworkVersion>

      如果缺少此元素,则以完全框架为目标。

    这三个元素由 Visual Studio 生成系统的公用目标组合在一起,构成一个称为目标框架名字对象 (TFM) 的标识符。

方案一:Visual Studio 以 .NET Framework 版本 3.5 为目标

假设 Visual Studio 正在 .NET Framework 版本 4 下运行。 若要以 .NET Framework 版本 3.5 为目标,必须安装关联的引用程序集和运行时程序集。 这些程序集包含在 .NET Framework 版本 3.5 SP1 中。

在此方案中,Visual Studio 设计器仅显示由 .NET Framework 版本 3.5 引用程序集筛选出的内容。在生成项目时,将针对这些引用程序集进行生成。 在运行项目时,项目在 .NET Framework 版本 3.5 运行时程序集上运行,而这些运行时程序集在 CLR 版本 2.0 上运行。

在将应用程序部署到另一台计算机上时,必须已在该计算机上安装 .NET Framework 版本 3.5。 可以在目标计算机上检查版本 3.5,并在需要时通过使用合适的再发行包 (redist) 安装该版本。

方案二:Visual Studio 在 .NET Framework 版本 4.1 上运行,以 .NET Framework 版本 4 为目标

假设 .NET Framework 版本 4.1 现已可用,并且版本 4 和版本 4.1 都在 CLR 版本 4 下运行。 如果安装了 .NET Framework 版本 4.1,则 Visual Studio 将自动在它下面运行。

对于以 .NET Framework 版本 4 为目标的项目,版本 4 引用程序集将筛选在 Visual Studio 设计器中可用的类型和成员,项目将针对这些引用程序集进行生成,并且生成的应用程序将针对版本 4 运行时程序集运行。

请参见

概念

在设计时解析程序集

MSBuild 高级概念

修订记录

日期

修订记录

原因

2010 年 8 月

将“使用 MSBuild 面向 .NET Framework 中的特定版本”合并到本主题中。

信息补充。