.NET Core Runtime 是否向后兼容以前的版本?

Is .NET Core Runtime backwards compatible with previous releases?

如果我安装了最新版本的 .NET Core 运行时(截至目前,版本为 2.2.3):

https://dotnet.microsoft.com/download/dotnet-core/2.2

该安装是否与以前版本的 .NET Core 向后兼容?

例如,上述安装是否与目标应用程序兼容:

我知道 .NET 运行时可以并行安装。但是,这并没有回答我的问题。一个 2.2 安装是否向后兼容以前的版本,这样就不需要额外的运行时了?

编辑 .NET Core 3.x SDK 已发布。与 v2.2 和之前的版本不同,此版本 支持针对以前 运行 次(即 netcoreapp2.2、netcoreapp2.1 等)的能力

tldr;

是的。通过安装 .NET Core Runtime 2.2.3,您可以 运行 面向 netcoreapp2.0、netcoreapp2.1 和 netcoreapp2.2 的应用,而无需额外安装 运行 次。

说明

微软:

...NET Core runtime updates are compatible within a major version 'band' such as 1.x and 2.x.

换句话说: (同一主要版本中的次要更新向后兼容)

微软:

Additionally, newer releases of the .NET Core SDK generally maintain the ability to build applications that target previous versions of the runtime in a compatible manner

换句话说: (最新的SDK可以针对之前的运行次)

微软:

In general, you only need the latest SDK and latest patch version of the runtimes required for your application.

换句话说: (一般来说,你应该只需要安装最新的SDK/runtime)

微软:

Over time, as you install updated versions of the .NET Core runtime and SDK, you may want to remove outdated versions of .NET Core from your machine. Removing older versions of the runtime may change the runtime chosen to run shared framework applications

换句话说: (随着时间的推移并排安装其他 SDKs/runtimes,您应该偶尔删除旧版本,以支持最新版本)

来源:https://docs.microsoft.com/en-us/dotnet/core/versions/remove-runtime-sdk-versions?tabs=windows

.NET 核心版本控制

根据文档:

".NET Core 2.1" refers to the .NET Core Runtime version number. The .NET Core Runtime has a major/minor/patch approach to versioning that follows semantic versioning.

换句话说,.NET Core 运行时间发布遵循 Semantic Versioning 方案:

[主要].[次要].[补丁]

其中:

  • 主要升级引入重大变化
  • 次要升级是向后兼容以前次要版本的功能升级
  • 补丁升级通常是对现有功能的错误修复或安全补丁(也向后兼容以前的次要版本)

所以,以上问题的答案是基于语义版本控制的:

  • 主要升级不向后兼容以前的主要版本
  • 次要 and/or 补丁升级在 相同 版本
  • 中向后兼容

根据这种理解,当 .NET Core 应用程序是 built/published/restored 时,它们针对主要版本和功能集,如 运行 时间名称中的 major/minor 版本号所示.因此,netcoreapp2.2 向后兼容 netcoreapp2.1,后者又向后兼容 netcoreapp2。 0。但都与 netcoreapp1.xnetcoreapp3.x.

不兼容

安装一次 .NET Core 2.1.5 运行时间,并假设依赖于框架的发布部署,您将能够 运行 应用定位:

  • netcoreapp2.0
  • netcoreapp2.1

但不是:

  • netcoreapp1.0(不兼容)
  • netcoreapp2.2(暂不支持)

如果安装了多个运行时间,则根据安装最高补丁的最新运行时间选择确切的运行时间。

关于 SDK

SDK 不基于语义版本控制。但是,每个 SDK 都针对一个最大的 .NET Core 运行时,并支持它之前的每个版本。

这意味着,如果您想针对多个 运行 次进行构建(即使您可以),则无需在构建服务器上安装多个 SDK。 SDK 已经包含了所有必要的 运行 次在当前版本(或任何先前版本)上构建应用程序 开箱即用 。例如,如果安装 .NET Core 2.2.105 SDK,则可以为 netcoreapp1.0、netcoreapp2.0、netcoreapp2.1 或 netcoreapp2.2 构建。但是您不能为 .NET Core 2.3 或 3.0 构建。

一个例子

假设我有一个构建服务器,它安装了最新的 .NET Core SDK (SDK 2.2.105 - 2.2.3 Runtime).

虽然安装了 SDK 2.2.105,但我可能想要构建和发布 .NET Core 2.1 应用程序:

dotnet publish 
     /p:Configuration=Release -r win-x64 --self-contained false
     /p:IsWebConfigTransformDisabled=true --framework netcoreapp2.1
     /p:DebugSymbols=false /p:DebugType=None
  • /p:Configuration=Release - 发布配置
  • -r win-x64 - 目标 Windows 部署(而不是便携式)。有关完整列表,请参阅此 https://docs.microsoft.com/en-us/dotnet/core/rid-catalog.
  • --self-contained false - 依赖于框架的部署(需要 运行 时间在主机上安装)
  • /p:IsWebConfigTransformDisabled=true - 不要转换 web.config 以避免 Visual Studio 生成的默认 web.config 错误(从 2.1 迁移到 2.2 时可能需要)
  • --framework netcoreapp2.1 - 明确针对 运行时间框架
  • /p:DebugSymbols=false /p:DebugType=None - 禁用 .PDB 文件

此版本可以安装在具有最新 运行 时间 .NET Core Runtime + Hosting Bundle 2.2.3 的生产服务器上 - 不需要其他 运行 时间(或 SDK)

希望这对其他人有帮助

如果您以 2.0 为目标,一些用法示例演示了该行为:

  1. 2.0 已指定。 2.0.5 是安装的最高补丁版本。使用 2.0.5。
  2. 2.0 已指定。没有安装 2.0.* 版本。 1.1.1 是安装的最高运行时。显示一条错误消息。
  3. 2.0 已指定。没有安装 2.0.* 版本。 2.2.2 是安装的最高 2.x 运行时版本。使用 2.2.2。
  4. 2.0 已指定。未安装 2.x 版本。 3.0.0 已安装。显示一条错误消息。

请参阅 Microsoft Docs 中的以下 link Microsoft Link