.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 具有37118可用 Api 的7949。

.NET 實作 版本支援
.NET 與 .NET Core 1.0、1.1、2.0、2.1、2.2、3.0、3.1、5.0、6。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
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/標準存放庫 會定義 .NET Standard api。

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

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

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

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

封裝表示

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

NuGet 套件是以一個或多個架構為目標。 .NET Standard 套件以 ".NET Standard" 架構為目標。 您可以使用 netstandardnetstandard (以 .NET Standard framework 為目標, 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 中繼套件的組合 建立 .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 程式庫,請確定您有Visual Studio 2022Visual Studio 2019或 Visual Studio 2017 15.3 版或更新版本已安裝在 Windows 上,或Visual Studio for Mac 在 macOS 上安裝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

    這是 作業系統特定 TFM 的範例,可將作業系統特定功能新增至所有參考的 專案。

何時將目標設為 net 5.0 或 net 6.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 + 的新程式碼的一些指導方針:

  • 應用程式元件

    如果您要使用程式庫將應用程式細分成數個元件,建議您將目標 net5.0 設為或 net6.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 的尾碼 ,例如 net6.0-windows 。 由於此 TFM 命名慣例,您可以輕鬆地分辨指定的應用程式是否可以使用指定的程式庫。 不需要版本號碼對應的資料表,例如 .NET Standard 的資料表。

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

    .NET Standard 會公開平臺特定的 Api。 您的程式碼可能會在沒有錯誤的情況下進行編譯,並且看似可移植到任何平臺,即使它無法移植。 當它在沒有指定 API 之執行的平臺上執行時,您會收到執行階段錯誤。

    .Net 5 + 中的方案: .NET 5 + Sdk 包含預設啟用的程式碼分析器。 平臺相容性分析器會偵測到您想要在其上執行的平臺上不支援的 Api 的意外使用。 如需詳細資訊,請參閱 平臺相容性分析器

.NET Standard 未淘汰

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

  • 用來在 .NET Framework 與其他所有 .net 的執行 netstandard2.0 之間共用程式碼。
  • netstandard2.1 來在 Mono、Xamarin 和 .Net Core 3.x 之間共用程式碼。

另請參閱