选择要使用的 .NET Core 版本Select the .NET Core version to use

本文内容

本文介绍 .NET Core 工具、SDK 和运行时在选择版本时所使用的策略。这些策略可通过使用指定版本,使正在运行的应用程序之间达到平衡,同时实现开发人员和最终用户计算机的轻松升级。这些策略执行以下操作:

SDK 使用最新安装的版本The SDK uses the latest installed version

SDK 命令包括 dotnet newdotnet run.NET Core CLI 必须为每个 dotnet 命令选择 SDK 版本。即使在以下情况下,它也会默认使用计算机上安装的最新 SDK:

  • 项目面向早期 .NET Core 运行时版本。
  • .NET Core SDK 的最新版本是预览版本。面向较旧的 .NET Core 运行时版本时,可利用最新的 SDK 功能和功能改进。可在不同项目上面向 .NET Core 的多个运行时版本,同时对所有项目使用相同的 SDK 工具。

在少数情况下,可能需要使用版本较旧的 SDK。global.json 文件中指定该版本 。“使用最新”策略表示仅使用 global.json 指定早于最新安装版本的一个 .NET Core SDK 版本 。

可将 global.json 放置在文件层次结构中的任何位置 。CLI 从项目目录中向上搜索其找到的第一个 global.json 。由用户控制对哪些项目应用给定的 global.json(按其在文件系统中的位置) 。.NET CLI 从当前工作目录路径向上导航,以迭代方式搜索 global.json 文件 。找到的第一个 global.json 文件指定要使用的版本 。如果已安装该版本,则使用该版本。如果未找到 global.json 中指定的 SDK,则 .NET CLI 前滚到安装的最新 SDK 。前滚操作与未找到 global.json 文件时的默认行为相同 。

下面的示例演示 global.json 语法 :

  1. {
  2. "sdk": {
  3. "version": "2.0.0"
  4. }
  5. }

选择 SDK 版本的过程如下:

  • dotnet 从当前工作目录向下导航路径,以迭代方式搜索 global.json 文件 。
  • dotnet 使用所找到的第一个 global.json 中指定的 SDK 。
  • 如果未找到 global.json,dotnet 使用最新安装的 SDK 。有关选择 SDK 版本的详细信息,可参阅 global.json 相关文章的匹配规则部分 。

目标框架名字对象用于定义生成时 APITarget Framework Monikers define build time APIs

针对在“目标框架名字对象”(TFM) 中定义的 API 构建项目 。在项目文件中指定目标框架按如下示例所示,设置项目文件中的 TargetFramework 元素:

  1. <TargetFramework>netcoreapp2.0</TargetFramework>

可能会针对多个 TFM 构建项目。对库设置多个目标框架更为常见,但也可对应用程序执行此操作。指定 TargetFrameworks 属性(TargetFramework 的复数形式)。目标框架以分号分隔,如下例所示:

  1. <TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>

给定的 SDK 支持固定的一组框架,其中的上限框架为 SDK 附带的运行时的目标框架。例如,.NET Core 2.0 SDK 包含 .NET Core 2.0 运行时,该运行时是 netcoreapp2.0 目标框架的一个实现。.NET Core 2.0 SDK 支持 netcoreapp1.0netcoreapp1.1netcoreapp2.0,但不支持 netcoreapp2.1(或更高版本)。安装 .NET Core 2.1 SDK 以针对 netcoreapp2.1 进行构建。

.NET Standard 目标框架中的上限框架同样是 SDK 附带的运行时的目标框架。.NET Core 2.0 SDK 的上限为 netstandard2.0

依赖于框架的应用会前滚Framework-dependent apps roll forward

在使用 dotnet run 从源运行应用程序时,在使用 dotnet myapp.dll框架相关部署 运行应用程序时,或使用 myapp.exe框架相关可执行文件 运行应用程序时,dotnet 可执行文件是应用程序的主机 。

该主机选择计算机上安装的最新修补程序版本。例如,如果在项目文件中指定 netcoreapp2.0,并且 2.0.4 是安装的最新 .NET 运行时,则使用 2.0.4 运行时。

如果未找到可接受的 2.0. 版本,则使用新的 2. 版本。例如,如果指定了 netcoreapp2.0 并且仅安装了 2.1.0,则应用程序在运行时使用 2.1.0 运行时。此行为称为“次要版本前滚”。此外,不会考虑较低版本。如果未安装可接受的运行时,应用程序将不会运行。

如果你面向版本 2.0,则下面几个使用示例展示了此行为:

  • 已指定 2.0。2.0.5 是安装的最高修补程序版本。则使用 2.0.5。
  • 已指定 2.0。未安装 2.0.* 版本。1.1.1 是安装的最高运行时版本。会显示一条错误消息。
  • 已指定 2.0。未安装 2.0.* 版本。2.2.2 是安装的最高 2.x 运行时版本。则使用 2.2.2。
  • 已指定 2.0。未安装 2.x 版本。已安装 3.0.0。会显示一条错误消息。次要版本回滚会产生一个可能影响最终用户的副作用。请参考以下方案:

  • 应用程序指定需要版本 2.0。

  • 运行时,未安装 2.0.*,安装的是 2.2.2。将使用版本 2.2.2。
  • 稍后,用户重新安装 2.0.5 和运行应用程序,而现将使用版本 2.0.5。2.0.5 和 2.2.2 可能具有不同行为,序列化二进制数据等方案中尤其如此。

独立部署包括所选的运行时Self-contained deployments include the selected runtime

可以将应用程序作为独立分发进行发布 。此方法可将 .NET Core 运行时和库与应用程序进行捆绑。独立部署不具有对运行时环境的依赖关系。在发布时(而不是运行时)选择运行时版本。

发布进程将选择给定运行时系列中的最新修补程序版本。例如,dotnet publish 将选择 .NET Core 2.0.4(如果它是 .NET Core 2.0 运行时系列中的最新修补程序版本)。目标框架(包括最新安装的安全修补程序)与应用程序捆绑打包。

如果为应用程序指定的最新版本不满足要求,会出现错误。dotnet publish 绑定到最新的运行时修补程序版本(在给定的主要及次要版本系列内)。dotnet publish 不支持 dotnet run 的前滚语义。有关修补程序和独立部署的详细信息,请参阅有关 .NET Core 应用程序部署中运行时修补程序选择的文章。

独立部署可能需要特定修补程序版本。可以重写项目文件中的最低运行时修补程序版本(重写为更高或更低版本),如下例所示:

  1. <RuntimeFrameworkVersion>2.0.4</RuntimeFrameworkVersion>

RuntimeFrameworkVersion 元素重写默认版本策略。对于独立部署,RuntimeFrameworkVersion 指定确切的运行时框架版本 。对于依赖于框架的应用程序,RuntimeFrameworkVersion 指定所需的最低运行时框架版本 。