.NET Core 2.1 中的重大更改

如果要迁移到 .NET Core 版本 2.1,本文中列出的重大变更可能会影响你的应用。

核心 .NET 库

路径 API 对无效字符不引发异常

涉及文件路径的 API 不再验证路径字符,或者在找到无效字符时引发 ArgumentException

更改描述

在 .NET Framework 和 .NET Core 1.0 - 2.0 中, 受影响的 API 部分中列出的方法在路径参数包含无效的路径字符时引发 ArgumentException 。 从 .NET Core 2.1 开始,这些方法不再检查 无效的路径字符 ,如果找到无效字符,则引发异常。

更改原因

主动验证路径字符会对某些跨平台场景形成阻碍。 引入了此更改,以便 .NET 不会尝试复制或预测作系统 API 调用的结果。 有关详细信息,请参阅关于 .NET Core 2.1 中 System.IO 的提前预览博客文章。

引入的版本

.NET Core 2.1

如果代码依赖于这些 API 来检查无效字符,则可以添加对 Path.GetInvalidPathChars的调用。

受影响的 API

另请参阅


添加到内置结构类型的私有字段

私有字段已添加到某些结构类型引用程序集中。 因此,在 C# 中,必须使用 新运算符默认文本来实例化这些结构类型。

更改描述

在 .NET Core 2.0 和更早的版本中,提供的某些结构类型,例如ConsoleKeyInfo,可以在不使用 C# 中的new运算符或默认字面量的情况下进行实例化。 这是因为 C# 编译器使用的 引用程序集 不包含结构的专用字段。 从 .NET Core 2.1 开始,.NET 结构类型的所有私有字段都将添加到引用程序集。

例如,以下 C# 代码在 .NET Core 2.0 中编译,但不在 .NET Core 2.1 中编译:

ConsoleKeyInfo key;    // Struct type

if (key.ToString() == "y")
{
    Console.WriteLine("Yes!");
}

在 .NET Core 2.1 中,上一个代码会导致以下编译器错误: CS0165 - 使用未分配的本地变量“key”

引入的版本

2.1

使用 new 运算符或 默认文本实例化结构类型。

例如:

ConsoleKeyInfo key = new ConsoleKeyInfo();    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");
ConsoleKeyInfo key = default;    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");

类别

核心 .NET 库

受影响的 API


macOS 上的 OpenSSL 版本

macOS 上的 .NET Core 3.0 及更高版本的运行时现在倾向于将 AesCcmAesGcmDSAOpenSslECDiffieHellmanOpenSslECDsaOpenSslRSAOpenSslSafeEvpPKeyHandle 类型使用 OpenSSL 1.1.x 版本,而不是 OpenSSL 1.0.x 版本。

.NET Core 2.1 运行时现在支持 OpenSSL 1.1.x 版本,但仍首选 OpenSSL 1.0.x 版本。

更改描述

以前,.NET Core 运行时在 macOS 上使用 OpenSSL 1.0.x 版本来处理与 OpenSSL 的交互类型。 最新的 OpenSSL 1.0.x 版本 OpenSSL 1.0.2 现已不受支持。 为了在受支持的 OpenSSL 版本中保留使用 OpenSSL 的类型,.NET Core 3.0 及更高版本的运行时现在在 macOS 上使用较新版本的 OpenSSL。

通过此更改,macOS 上的 .NET Core 运行时的行为如下所示:

  • .NET Core 3.0 及更高版本运行时使用 OpenSSL 1.1.x(如果可用),并且仅当没有可用的 1.1.x 版本时,才回退到 OpenSSL 1.0.x。

    对于使用 OpenSSL 互操作类型和自定义 P/Invoke 的用户,请遵循 SafeEvpPKeyHandle.OpenSslVersion 备注中的指南。 如果未检查该值, OpenSslVersion 应用可能会崩溃。

  • .NET Core 2.1 运行时使用 OpenSSL 1.0.x(如果可用),如果没有可用的 1.0.x 版本,则回退到 OpenSSL 1.1.x。

    2.1 运行时更喜欢早期版本的 OpenSSL,因为 .NET Core 2.1 中不存在该 SafeEvpPKeyHandle.OpenSslVersion 属性,因此在运行时无法可靠地确定 OpenSSL 版本。

引入的版本

  • .NET Core 2.1.16
  • .NET Core 3.0.3
  • .NET Core 3.1.2

类别

核心 .NET 库

受影响的 API


MSBuild

SDK 中现在包含的项目工具

.NET Core 2.1 SDK 现在包含常见的 CLI 工具,不再需要从项目引用这些工具。

更改描述

在 .NET Core 2.0 中,项目通过 <DotNetCliToolReference> 项目设置引用外部 .NET 工具。 在 .NET Core 2.1 中,其中一些工具包含在 .NET Core SDK 中,并且不再需要该设置。 如果在项目中包括对这些工具的引用,将收到如下所示的错误:. NET Core SDK 中现在包含工具“Microsoft.EntityFrameworkCore.Tools.DotNet”。

.NET Core 2.1 SDK 中现在包含的工具:

<DotNetCliToolReference> 值 工具
Microsoft.DotNet.Watcher.Tools dotnet-watch
Microsoft.Extensions.SecretManager.Tools dotnet-user-secrets
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

引入的版本

.NET Core SDK 2.1.300

从项目中删除<DotNetCliToolReference>设置。

类别

MSBuild

受影响的 API


另请参阅