.NET Standard

.NET Standard 是 .NET API 的正式規格,可在多個 .NET 實作上使用。 .NET Standard 背後的動機是在 .NET 生態系統中建立更大的統一性。 .NET 5 和更新版本採用不同的方法來建立統一性,以消除大部分案例中 .NET Standard 的需求。 不過,如果您想要在 .NET Framework 與任何其他 .NET 實作之間共用程式碼,例如 .NET Core,您的程式庫應以 .NET Standard 2.0 為目標。 不會發行任何新版本的 .NET Standard,但 .NET 5、.NET 6 和所有未來的版本都會繼續支援 .NET Standard 2.1 和更早版本。

如需在 .NET 5+ 和 .NET Standard 之間選擇的相關資訊,請參閱本文稍後的 .NET 5+ 和 .NET Standard

.NET Standard 版本

.NET Standard 已設定版本。 每個新版本都會新增更多 API。 針對特定 .NET Standard 版本建置程式庫時,它可以在任何實作該版本的 .NET Standard (或更新版本的 .NET 實作上執行) 。

以較高版本的 .NET Standard 為目標,可讓程式庫使用更多 API,但表示它只能用於較新版本的 .NET。 以較低的版本為目標可減少可用的 API,但表示程式庫可以在更多位置執行。

選取 .NET Standard 版本

.NET Standard 1.0 有 7,949 個 37,118 個可用的 API。

.NET 實作 版本支援
.NET 與 .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6, 5.4, 6.4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin.Mac 3.0, 3.8, 5.16
Xamarin.Android 7.0, 8.0, 10.0
通用 Windows 平台 8.0、8.1、10.0、10.0.16299、TBD
Unity 2018.1

如需詳細資訊,請參閱 .NET Standard 1.0。 若為互動式資料表,請參閱 .NET Standard 版本

要以哪個 .NET Standard 版本作為目標

除非您需要支援舊版,否則建議您以 .NET Standard 2.0 為目標。 大部分的一般用途程式庫應該不需要 .NET Standard 2.0 以外的 API。 所有新式平台都支援 .NET Standard 2.0,而且是以一個目標支援多個平台的建議方法。

如果您需要支援 .NET Standard 1.x,建議您 以 .NET Standard 2.0 為目標。 .NET standard 1.x 是以一組精細的 NuGet 套件形式發佈,它建立了一個大型的套件相依性圖形,並導致開發人員在建置時下載了大量的套件。 如需詳細資訊,請參閱本文稍後的 跨平臺目標.NET 5+ 和 .NET Standard

.NET Standard 版本控制規則

有兩個主要的版本控制規則:

  • 累加:.NET Standard 版本就邏輯而言是同心圓:較新的版本會包含來自較舊版本的所有 API。 版本之間並沒有任何重大變更。
  • 固定:.NET Standard 在出貨後,版本即凍結。

2.1 之後將不會有新的 .NET Standard 版本。 如需詳細資訊,請參閱本文稍後的 .NET 5+ 和 .NET Standard

規格

.NET Standard 規格是一組標準化的 API。 規格是由 .NET 實作者維護,特別是 Microsoft (包含 .NET Framework、.NET Core 和 Mono) 和 Unity。

正式成品

官方規格是一組 .cs 檔案,可定義屬於標準一部分的 API。 (中的 ref 目錄 現在封存) dotnet/standard 存放庫 會定義 .NET Standard API。

NETStandard.Library 中繼套件 (原始檔) 描述定義 (部分) 一或多個 .NET Standard 版本的程式庫集合。

像是 System.Runtime 等指定的元件,其描述:

  • .NET Standard 的組件 (僅限其範圍)。
  • 適用於該範圍的多個 .NET Standard 版本。

為了更方便閱讀及支援特定開發人員案例 (例如使用編譯器),已提供衍生成品。

封裝表示

.NET Standard 參考組件的主要散發工具是 NuGet 套件。 傳遞實作的方法有許多種,各自適合每種 .NET 實作。

NuGet 套件是以一個或多個架構為目標。 .NET Standard 套件的目標為 「.NET Standard」 架構。 例如,您可以使用精簡 TFM (以 .NET Standard 架構 netstandard 為目標, netstandard1.4 例如) 。 要在多個 .NET 實作上執行的程式庫應該以這個架構為目標。 對大多數的 API 來說,會以 netstandard2.0 為目標,因為提供的 API 數目,超過 .NET Standard 1.6 與 2.0 之間的一倍。

NETStandard.Library 中繼套件會參考定義 .NET Standard 的一組完整 NuGet 套件。 若要將 netstandard 設為目標,最常見方式是參考這個中繼套件。 它描述大約 40 種定義 .NET Standard 的 .NET 程式庫和相關 API,並提供其存取權。 您可以參考目標為 netstandard 的其他套件,以存取其他 API。

版本控制

規格不是單數,而是線性建立版本的 API 集合。 此標準的第一個版本會建立一組基準 API。 後續版本會新增 API,並繼承舊版所定義的 API。 沒有已建立的布建可從標準中移除 API。

.NET Standard 不是任何一個 .NET 實作特有的,也不會符合這些實作的任何版本設定配置。

如先前所述,2.1 之後將不會有新的 .NET Standard 版本。

目標 .NET Standard

您可以使用架構和 NETStandard.Library 中繼套件的組合 netstandard建置 .NET Standard 程式庫

.NET Framework 相容性模式

從 .NET Standard 2.0 開始,引進了 .NET Framework 相容性模式。 此相容性模式可讓 .NET Standard 專案可參考 .NET Framework 程式庫,就如同是為 .NET Standard 編譯一般。 並非所有專案都適合參考 .NET Framework 程式庫。例如,像是使用 Windows Presentation Foundation (WPF) API 的程式庫。

如需詳細資訊,請參閱 .NET Framework 相容模式

.NET Standard 程式庫與 Visual Studio

若要在 Visual Studio 中建置 .NET Standard 程式庫,請確定您在 macOS 上安裝Visual Studio 2022Visual Studio 2019 或 Visual Studio 2017 15.3 版或更新版本,或Visual Studio for Mac 7.1版或更新版本。

若在您專案中只需要使用 .NET Standard 2.0 程式庫,也可於 Visual Studio 2015 中執行。 但需要安裝 NuGet 用戶端 3.6 或更新版本。 您可從 NuGet下載頁面,下載 Visual Studio 2015 的 NuGet 用戶端。

.NET 5+ 和 .NET Standard

.NET 5 和 .NET 6 是單一產品,具有一組統一的功能和 API,可用於 Windows 傳統型應用程式和跨平臺主控台應用程式、雲端服務和網站。 例如,.NET 5 TFM會反映此廣泛的案例:

  • net5.0

    此 TFM 適用于可在任何地方執行的程式碼。 但有一些例外狀況,它只包含可跨平臺運作的技術。 針對 .NET 5 程式碼, net5.0 取代 netcoreappnetstandard TFM。

  • net5.0-windows

    這是 OS 特定 TFM 的範例,可將 OS 特定功能新增至所參考的所有內容 net5.0

目標為 net5.0 或 net6.0 與 netstandard 的時機

針對以 為目標 netstandard 的現有程式碼,不需要將 TFM 變更為 net5.0net6.0 。 .NET 5 和 .NET 6 會實作 .NET Standard 2.1 和更早版本。 將目標從 .NET Standard 重定為 .NET 5+ 的唯一原因,就是取得更多執行時間功能、語言功能或 API 的存取權。 例如,若要使用 C# 9,您需要以 .NET 5 或更新版本為目標。 您可以多目標 .NET 5 或 .NET 6 和 .NET Standard 來存取較新的功能,並仍然讓程式庫可供其他 .NET 實作使用。

以下是適用于 .NET 5+ 之新程式碼的一些指導方針:

  • 應用程式元件

    如果您使用程式庫將應用程式細分成數個元件,建議您以 或 net6.0 為目標 net5.0 。 為了簡單起見,最好讓組成應用程式的所有專案保持在相同版本的 .NET 上。 然後,您可以在任何地方假設相同的 BCL 功能。

  • 可重複使用的程式庫

    如果您要建置打算在 NuGet 上寄送的可重複使用程式庫,請考慮觸達與可用功能集之間的取捨。 .NET Standard 2.0 是.NET Framework所支援的最新版本,因此可搭配相當大型的功能集使用。 我們不建議以 .NET Standard 1.x 為目標,因為您可以限制可用功能集,以達到最小增加。

    如果您不需要支援.NET Framework,則可以使用 .NET Standard 2.1 或 .NET 5/6。 建議您略過 .NET Standard 2.1,並直接移至 .NET 6。 大部分廣泛使用的程式庫都會針對 .NET Standard 2.0 和 .NET 5+ 多目標。 支援 .NET Standard 2.0 可讓您最觸達,同時支援 .NET 5+ 可確保您可以針對已在 .NET 5+ 上的客戶運用最新的平臺功能。

.NET Standard 問題

以下是 .NET Standard 的一些問題,可協助說明為何 .NET 5 和更新版本是跨平臺和工作負載共用程式碼的最佳方式:

  • 新增 API 的速度緩慢

    .NET Standard 已建立為所有 .NET 實作都必須支援的 API 集合,因此有建議的檢閱程式可新增 API。 目標是只標準化可在所有目前和未來的 .NET 平臺中實作的 API。 結果是,如果功能遺漏特定版本,您可能必須等候數年,才能新增至標準版本。 然後,您等候更長的時間,才能廣泛支援新版本的 .NET Standard。

    .NET 5+: 實作功能時,每個 .NET 5+ 應用程式和程式庫都已可使用此功能,因為程式碼基底是共用的。 而且,由於 API 規格與其實作之間沒有任何差異,因此您可以利用比 .NET Standard 更快速的新功能。

  • 複雜版本控制

    API 規格與其實作分離會導致 API 規格版本與實作版本之間的複雜對應。 本文稍早所示的表格中明顯出現這種複雜性,以及如何解譯它的指示。

    .NET 5+: .NET 5+ API 規格與其實作之間沒有分隔。 結果是簡化的 TFM 配置。 所有工作負載都有一個 TFM 前置詞: net5.0net6.0 用於程式庫、主控台應用程式和 Web 應用程式。 唯一的變化是後 綴,指定特定平臺的平臺特定 API ,例如 net5.0-windowsnet6.0-windows 。 由於此 TFM 命名慣例,您可以輕鬆地分辨指定的應用程式是否可以使用指定的程式庫。 不需要版本號碼對等資料表,例如 .NET Standard 的版本號碼。

  • 執行時間不支援的平臺例外狀況

    .NET Standard 會公開平臺特定的 API。 您的程式碼可能會在沒有錯誤的情況下進行編譯,而且即使它不是可攜式,也似乎可移植到任何平臺。 當它執行于沒有指定 API 實作的平臺上時,您會收到執行階段錯誤。

    .NET 5+: .NET 5+ SDK 包含預設啟用的程式碼分析器。 平臺相容性分析器會偵測不小心使用您想要執行的平臺不支援的 API。 如需詳細資訊,請參閱 平臺相容性分析器

.NET Standard 未過時

多個 .NET 實作可以使用的程式庫仍然需要 .NET Standard。 建議您在下列案例中以 .NET Standard 為目標:

  • 使用 netstandard2.0 在.NET Framework與 .NET 所有其他實作之間共用程式碼。
  • 用來 netstandard2.1 在 Mono、Xamarin 和 .NET Core 3.x 之間共用程式碼。

另請參閱