簡體   English   中英

.NET 標准、.NET 核心、PCL

[英].NET Standard, .NET Core, PCL

.NET Standard 一直是一個令人困惑的概念。 標准 .NET 庫格式的想法聽起來很棒。 但是,具體是什么還不清楚。 Visual Studio 中現在有 .NET Core 和 .NET Standard 類庫項目模板,以及舊的 PCL 項目。 我還發現,如果您進入項目的設置,您可以將現有的 PCL 庫切換到 .NET Standard。 不清楚 .NET 標准是否是一個庫? 或 DLL 格式。

我要問的基本問題是我們應該針對哪種類型的庫? 我主要是為 Xamarin 項目做這件事,但如果我們可以與其他平台共享這些庫,尤其是 .NET Core 和 UWP,那就太好了。 令人困惑的是,微軟為什么同時推出了兩種看似相同的類庫類型:.NET Core 和 .NET Standard。

定義

NET Core - 符合 .NET Standard API 定義的基於 .NET 的運行時環境。

PCL - 一種基於 .NET 的庫格式,受多種運行時環境支持,包括 .NET、Mono、UWP 等

.NET Standard(定義 1) - 一組基於 .NET 的運行時環境的標准 API 定義

.NET Standard(定義 2) - 一種基於 .NET 的庫格式,受多種運行時環境支持,包括 .NET、Mono、UWP 等,它是 PCL 格式的延續。 在 Visual Studio 中,通過進入項目的屬性並編輯目標框架,可以將 PCL 庫轉換為 .NET Standard 庫。

圍繞這個的文檔確實比較混亂,但大致可以這樣理解:

  • PCL:針對一組平台的庫(具有這些平台的 API 的“最小公分母”)。 因此,在編寫 PCL 時,您是說我要針對平台 A、B、C

  • .NET 標准:一組“標准”的 API 而不是平台。 所以基本上你不關心平台,只關心標准(版本 1.3、1.6 ...),你的代碼將在支持它的所有平台上工作。

  • 在這里不要混淆 .NET 核心,它是 .NET 框架的“另一個版本”。 .NET 標准將跨運行時工作(.NET 框架、.NET 核心、Mono)

所以我想 .NET 標准是要走的路:)

我相信這個資源可以回答你的大部分問題:

https://docs.microsoft.com/en-us/dotnet/articles/standard/library

.NET 標准庫是 .NET API 的正式規范,旨在用於所有 .NET 運行時。 標准庫背后的動機是在 .NET 生態系統中建立更大的統一性。

據我了解,其他庫類型是特定於平台的,而 .NET 標准在某種程度上與平台無關。

如果您希望您的代碼在不同平台上可用,那么 .NET 標准似乎是理想的,但請密切注意其他平台支持的 .NET 標准版本(請參閱鏈接中的表格)。

希望這有幫助

這來自 Samuel Englad ( https://github.com/dotnet/corefx/issues/973#issuecomment-249582799 ):

.NET DLL 根據 ECMA-335(更好地稱為公共語言基礎結構)進行格式化。 這種格式適用於我們稱為 .NET 的所有平台; 完整框架、核心、Xamarin、Mono、Silverlight 等。

不能使用針對一個平台和另一個平台編譯的 DLL 的原因是該格式沒有指定 API(一般來說)。 因此,雖然他們都可以讀取 DLL,但您會遇到類 XYZ 位於一個平台上的命名空間 ABC 和另一個平台上的命名空間 DEF(如果它存在的話)的問題。

PCL 通過做兩件事“解決”了這個問題:

他們使用了類型轉發,因此即使您編寫的代碼期望在命名空間 ABC 中使用 XYZ 類,它也可以在其他地方擁有它的平台上找到。 它將您可以使用的 API 限制為您想要的所有平台共享的最低公共集。

使用 PCL 並將其轉換為 .NET Standard 項目不是因為輸出格式而是因為包含元數據(特別是類型轉發)而重新編譯。

因此,我認為 .NET Standard 庫本質上與 PCL 庫沒有什么不同,只是它們在不同的標准化 API 集之上放置了一層,並且這些 API 可能實現不同的指針(類型轉發)。

.NET Core 當然是一個運行時環境,但我認為它與 .NET Standard 非常接近。 除了實現 .NET Standard API 之外,我認為它與它沒有任何特殊關系。

在我看來,以 .NET 標准類庫為目標通常會更好,因為這將跨多個平台兼容 例如,如果您面向 .NET Core,則無法在 UWP 中引用此程序集類型。 你會看到這個:

在此處輸入圖片說明

但是,如果您在純 .NET Core 環境中工作,您可能會發現有特定於 .NET Core 運行時環境的可用 API,因此有必要直接面向 .NET Core。

請參閱此詞匯表: https : //github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

標准是針對類似於 Android API 版本的特定 API 集。 nuget 庫只是包含符合標准的所有庫的元包。

MSDEV 節目中的 Scott Hunter 很好地解釋了這個概念。 值得一試 - http://msdevshow.com/2016/07/dot-net-core-with-scott-hunter/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM