.NET Core 2.1 的中斷性變更

若您要移轉至 2.1 版的 .NET Core,本文所列的中斷性變更可能影響您的應用程式。

Core .NET 程式庫

Path API 不會針對無效字元擲回例外狀況

涉及檔案路徑的 API,已不再會驗證路徑字元,或在偵測到無效字元時擲回 ArgumentException

變更描述

在 .NET Framework 和 .NET Core 1.0 - 2.0 中,若 path 引數包含無效的路徑字元,受影響的 API 區段中所列的方法,將會擲回 ArgumentException。 自 .NET Core 2.1 起,這些方法已不再會檢查無效的路徑字元,或在偵測到無效字元時,擲回例外狀況。

變更原因

積極驗證路徑字元會造成某些跨平台案例窒礙難行。 進行這項變更之後,.NET 將不再嘗試複寫或預測作業系統 API 呼叫的結果。 如需詳細資訊,請參閱 .NET Core 2.1 中的 System.IO 搶先看部落格文章。

導入的版本

.NET Core 2.1

若您的程式碼仍須透過這些 API 檢查無效的字元,可以新增對 Path.GetInvalidPathChars 的呼叫。

受影響的 API

另請參閱


新增至內建結構類型的私人欄位

私人欄位已新增至參考元件中的特定結構類型。 因此在 C# 中,這些建構類型一律需要使用 new 運算子預設常值加以具現化。

變更描述

在 .NET Core 2.0 和舊版中,所提供的一些結構類型 (例如 ConsoleKeyInfo) 在 C# 中無須使用 new 運算子或預設常值,就能具現化。 這是因為 C# 編譯器使用的參考元件不含結構的私人欄位。 .NET 結構類型的所有私人欄位自 .NET Core 2.1 起,都已新增至參考元件。

例如下列 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!");

類別

Core .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 互動的類型,會使用 OpenSSL 1.0.x 版。 目前已不支援最新的 OpenSSL 1.0.x 版和 OpenSSL 1.0.2。 為維持使用 OpenSSL 的類型使用支援的 OpenSSL 版本,.NET Core 3.0 及更新版本的執行階段現在會在 macOS 上使用較新版本的 OpenSSL。

這項變更促使 macOS 上 .NET Core 執行階段的行為執行如下:

  • 如有提供 OpenSSL 1.1.x,.NET Core 3.0 及更新版本的執行階段會使用 OpenSSL 1.1.x,只有在未提供 1.1.x 版的情況下,才會回復為 OpenSSL 1.0.x。

    對於使用 OpenSSL Interop 搭配自訂 P/Invokes 的呼叫端,請遵循 SafeEvpPKeyHandle.OpenSslVersion 備註中的指引作業。 若未檢查 OpenSslVersion 值,您的應用程式可能損毀。

  • 如有提供 OpenSSL 1.0.x,.NET Core 2.1 執行階段會使用 OpenSSL 1.0.x;若無 1.0.x 版,才會回復為 OpenSSL 1.1.x。

    2.1 執行階段會優先使用舊版的 OpenSSL 1.0.x。這是因為 .NET Core 2.1 沒有 SafeEvpPKeyHandle.OpenSslVersion 屬性,以致於無法在執行時準確判斷 OpenSSL 版本。

導入的版本

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

類別

Core .NET 程式庫

受影響的 API


MSBuild

SDK 中目前包含的專案工具

.NET Core 2.1 SDK 現在已包含常用的 CLI 工具,因此您不再需要從專案參考這些工具。

變更描述

在 .NET Core 2.0 中,專案會參考具有 <DotNetCliToolReference> 專案設定的外部 .NET 工具。 在 .NET Core 2.1 中,.NET Core SDK 已包含了其中一些工具,因此不再需要該設定。 您的專案若包含對這些工具的參考,將會收到如下的錯誤:工具 'Microsoft.EntityFrameworkCore.Tools.DotNet' 現已包含在 .NET Core SDK 中。

現已包含在 .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

N/A


另請參閱