.NET Standard

.NET Standard 是多個 .NET 實作中提供的 .NET API 的正式規格。 .NET Standard 背後的動機是在 .NET 生態系統中建立更高的一致性。 .NET 5 和更新版本採用不同的方法來建立統一性,以消除大多數案例中 .NET Standard 的需求。 不過,如果您想要在 .NET Framework 與任何其他 .NET 實作之間共用程序代碼,例如 .NET Core,您的連結庫應該以 .NET Standard 2.0 為目標。 不會發行新版本的 .NET Standard,但 .NET 5 和所有更新版本將繼續支援 .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 在 37,118 個可用的 API 中,有 7,949 個。

.NET 實作 版本支援
.NET 與 .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.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。 (now archived) dotnet/standard 存放庫中的 ref 目錄會定義 .NET Standard API。

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

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

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

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

封裝表示

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

NuGet 套件是以一個或多個架構為目標。 .NET Standard 套件以 “.NET Standard” 架構為目標。 您可使用 netstandard壓縮 TFM (例如,netstandard1.4),以 .NET Standard 架構為目標。 打算在 .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、.NET 7 和 .NET 8 是單一產品,具有一組統一的功能和 API,可用於 Windows 傳統型應用程式和跨平臺控制台應用程式、雲端服務和網站。 例如,.NET 8 TFM 會反映此廣泛的案例:

  • net8.0

    此 TFM 適用於隨處執行的程式代碼。 但有一些例外,它只包含可跨平台運作的技術。 針對 .NET 8 程式代碼, net8.0netcoreapp 取代 和 netstandard TFM。

  • net8.0-windows

    這是OS特定TFM範例,會將OS特定功能新增至參考的所有專案net8.0

目標為 net8.0 與 netstandard 的時機

針對以 為目標 netstandard的現有程序代碼,不需要將 TFM 變更為 net8.0 或更新版本的 TFM。 .NET 8 會實作 .NET Standard 2.1 和更早版本。 將目標從 .NET Standard 複位為 .NET 8+ 的唯一理由,就是取得更多運行時間功能、語言功能或 API 的存取權。 例如,若要使用 C# 9,您需要以 .NET 5 或更新版本為目標。 您可以多目標 .NET 8 和 .NET Standard 來存取較新的功能,並讓連結庫可供其他 .NET 實作使用。

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

  • 應用程式元件

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

  • 可重複使用的連結庫

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

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

.NET Standard 問題

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

  • 新增 API 的速度緩慢

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

    .NET 5+中的解決方案: 實作功能時,因為程式代碼基底已可供每個 .NET 5+ 應用程式和連結庫使用。 由於 API 規格與其實作之間沒有任何差異,因此您可以利用比 .NET Standard 快得多的新功能。

  • 複雜版本控制

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

    .NET 5+中的解決方案: .NET 5+ API 規格與其實作之間沒有區隔。 結果是簡化的 TFM 配置。 所有工作負載都有一個 TFM 前置詞: net8.0 用於連結庫、控制台應用程式和 Web 應用程式。 唯一 的變化是後綴,指定特定平台的平臺特定 API ,例如 net8.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 之間共用程序代碼。

另請參閱