.NET Core 是一個通用開發(fā)平臺,由 Microsoft 和 GitHub 上的 .NET 社區(qū)共同維護。 它是跨平臺的,支持 Windows、macOS 和 Linux,并且可用于設備、云和嵌入式/IoT 方案。
以下特征對 .NET Core 進行了最好的定義:
- 部署靈活:可以包含在應用或已安裝的并行用戶或計算機范圍中。
- 跨平臺:可以在 Windows、macOS 和 Linux 上運行;也可移植到其他操作系統(tǒng)。 Microsoft、其他公司和個人提供的支持的操作系統(tǒng) (OS)、CPU 和應用程序方案會隨著時間推移而增多。
- 命令行工具:可在命令行中執(zhí)行所有產(chǎn)品方案。
- 兼容性:.NET Core 通過 .NET 標準與 .NET Framework、Xamarin 和 Mono 兼容。
- 開放源:.NET Core 是一個開放源平臺,使用 MIT 和 Apache 2 許可證。 文檔由 CC-BY 許可發(fā)行。 .NET Core 是一個 .NET Foundation 項目。
- 由 Microsoft 支持:.NET Core 由 Microsoft 依據(jù) .NET Core 支持提供支持
構(gòu)成
.NET Core 包括以下部分:
- .NET 運行時:提供類型系統(tǒng)、程序集加載、垃圾回收器、本機互操作和其他基本服務。
- 一組 框架庫:提供基元數(shù)據(jù)類型、應用編寫類型和基本實用程序。
- 一組 SDK 工具和語言編譯器:提供基本的開發(fā)人員體驗,可用于 .NET Core SDK。
- “dotnet”應用主機,用于啟動 .NET Core 應用。 它選擇運行時并托管運行時,提供程序集加載策略來啟動應用。 同一主機還可用于以大致相同的方式啟動 SDK 工具。
語言
可以使用 C#、Visual Basic 和 F# 語言編寫適用于 .NET Core 的應用程序和庫。 在 .NET Core 上運行的編譯器可以在其運行的任何地方進行 .NET Core 開發(fā)。 一般情況下,不會直接使用編譯器,但會間接使用 SDK 工具。
C#、Visual Basic 和 F# 編譯器以及 .NET Core 工具已集成到或可以集成到多個文本編輯器和 IDE 中,包括 Visual Studio、Visual Studio Code、Sublime Text 和 Vim,使 .NET Core 開發(fā)可以在鐘愛的編碼環(huán)境和 OS 中進行。 這種集成部分由 OmniSharp 項目的高手提供。
.NET API 和兼容性
可將 .NET Core 看作是 .NET Framework 在 .NET Framework 基類庫 (BCL) 的跨平臺版本。 它實施 .NET 標準規(guī)范。 .NET Core 提供了一個可用于 .NET Framework 或 Mono/Xamarin 的 API 子集。 在某些情況下,類型未完全實現(xiàn)(某些成員不可用或已移動)。
有關 .NET Core API 的詳細信息,請參閱 .NET Core roadmap(.NET Core API 產(chǎn)品系列)。
與 .NET Standard 的關系
.NET Standard是一種 API 規(guī)范,用于描述開發(fā)者可以在每個 .NET 實現(xiàn)代碼中使用的一組一致 .NET API。 .NET 實現(xiàn)需要實現(xiàn)此規(guī)范才能被視為符合 .NET Standard ,并且才能支持面向 .NET Standard 的庫。
由于 .NET Core 可實現(xiàn) .NET Standard,因此也支持 .NET Standard 庫。
工作負載
就本身而言,.NET Core 包括單個應用程序模型(控制臺應用),這對工具、本地服務和基于文本的游戲很有用。 除 .NET Core 外,還生成了其他應用程序模型以擴展其功能,例如:
開放源
.NET Core 屬于開放源(MIT 許可證),由 Microsoft 于 2014 年提供給 .NET Foundation。 現(xiàn)在它是最活躍的 .NET Foundation 項目之一。 可由個人和企業(yè)自由采用,包括用于個人、學術或商業(yè)目的。 許多公司已使用 .NET Core 作為應用、工具、新平臺和托管服務的一部分。 其中某些公司對 GitHub 上的 .NET Core 做出了巨大貢獻,并作為 .NET Foundation Technical Steering Group(.NET Foundation 技術控制組)的成員,指導產(chǎn)品方向。
獲取
.NET Core 主要以兩種方式發(fā)行,以包方式在 NuGet.org 上發(fā)行,以及以獨立方式分發(fā)。
分發(fā)
可以在 .NET Core 入門頁下載 .NET Core。
-
Microsoft.NET Core 分發(fā)包括 CoreCLR 運行時、關聯(lián)庫、控制臺應用程序主機和
dotnet
應用啟動器。 相關描述請參見Microsoft.NETCore.App
元包。 - Microsoft .NET Core SDK 分發(fā)包括 .NET Core 和一套用來還原 NuGet 數(shù)據(jù)包以及編譯并生成應用的工具。
通常情況下,將首先安裝 .NET Core SDK,以開始 .NET Core 開發(fā)。 可以選擇安裝其他 .NET Core 版本(可以是預發(fā)行版)。
包
- .NET Core 包包含 .NET Core 運行時和庫(引用程序集和實現(xiàn))。 例如,System.Net.Http。
- .NET Core 元包通過引用相應的帶有版本的庫包組合來描述各個層和應用模型。
體系結(jié)構(gòu)
.NET Core 是一個跨平臺的 .NET 實現(xiàn)。 .NET Core 特有的主要體系結(jié)構(gòu)是為支持的平臺提供特定于平臺的實現(xiàn)。
環(huán)境
.NET Core 由 Microsoft 在 Windows、macOS 和 Linux 上提供支持。 在 Linux 上,Microsoft 主要支持 Red Hat Enterprise Linux (RHEL) 和 Debian 分發(fā)系列上運行的 .NET Core。
.NET Core 目前支持 X64 CPU。 在 Windows 上,也支持 X86。 將支持 ARM64 和 ARM32。
有關工作負荷和 OS 以及 CPU 環(huán)境支持和計劃的更詳細信息,請參閱 .NET Core Roadmap(.NET Core 產(chǎn)品系列)。
對于其他應用類型和環(huán)境,其他公司或團體可能支持 .NET Core。
針對適應性而設計
與其他 .NET 產(chǎn)品相比,生成的 .NET Core 與它們十分類似,但具有唯一性。 其目的是能夠適應廣泛的新平臺、新的工作負荷和新的編譯器工具鏈。 它有多個 OS 和 CPU 端口正在使用中,并可以移植到更多端口。 以 LLILC 項目為例,它是早期 .NET Core 通過 LLVM 編譯器進行本地編譯的原型。
該產(chǎn)品分為幾個部分,使各個部件能夠根據(jù)不同的計劃適應新的平臺。 必須將運行時和特定于平臺的基礎庫作為一個單元進行移植。 與平臺無關的庫應在所有平臺上按照構(gòu)建的原樣運行。 對于通過減少特定于平臺的實現(xiàn)以提高開發(fā)人員效率方面,項目存在偏差,但每當可以以此方式全部或部分實現(xiàn)算法或 API 時,都應首選與平臺無關的 C# 代碼。
人們經(jīng)常會問,為支持多個操作系統(tǒng)應如何實現(xiàn) .NET Core。 他們還會問是否存在單獨的實現(xiàn),或是否使用 conditional compilation(條件編譯)。 這兩者都在用,但強烈偏向條件編譯。
可以在下面的圖表看出大多數(shù) CoreFX 都是與平臺無關的代碼,該代碼可在所有平臺共享。 不限平臺的代碼可實現(xiàn)為在所有平臺上使用的單個可移植程序集。
Windows 和 Unix 實現(xiàn)大小相似。 Windows 具有較大的實現(xiàn),因為 CoreFX 實現(xiàn)了某些僅適用于 Windows 的功能,如 Microsoft.Win32.Registry,但尚未實現(xiàn)任何僅適用于 Unix 的概念。 你將發(fā)現(xiàn)大多數(shù) Linux 和 macOS 實現(xiàn)都是在 Unix 實現(xiàn)中實現(xiàn)的,而特定于 Linux 和 macOS 的實現(xiàn)大小大致相同。
.NET Core 中混合存在特定于平臺和與平臺無關的庫。 可以查看幾個示例中的模式:
- CoreCLR 是特定于平臺的。 它是使用 C/C++ 生成的,因此根據(jù)構(gòu)造,它是特定于平臺的。
- 考慮到每個 OS 上的存儲和加密 API 具有顯著差異,System.IO 和 System.Security.Cryptography.Algorithms 是特定于平臺的。
- 考慮到它們是通過數(shù)據(jù)結(jié)構(gòu)創(chuàng)建和操作,System.Collections 和 System.Linq 是與平臺無關的。
與其他 .NET 實現(xiàn)比較
將 .NET Core 與現(xiàn)有的 .NET 實現(xiàn)進行比較,這可能是了解其大小和形狀最簡單的方法。
與 .NET Framework 比較
.NET 由 Microsoft 于 2000 年首次發(fā)布,而后發(fā)展至今。 15 年多以來,.NET Framework 一直是 Microsoft 出品的主要 .NET 實現(xiàn)。
.NET Core 和 .NET Framework 的主要差異在于:
- 應用模型 -- .NET Core 不支持所有 .NET Framework 應用模型,某種程序上是因為其中許多模型都是基于 Windows 技術,如 WPF(基于 DirectX 生成)。 但 .NET Core 和 .NET Framework 兩者都支持控制臺和 ASP.NET Core 應用模型。
- API -- .NET Core 包含很多與 .NET Framework 相同,但數(shù)量較少的 API,并且具有不同的組成要素(程序集名稱不同;關鍵用例中的類型形狀不同)。 目前,這些差異通常都需要更改,以將源移植到 .NET Core。 .NET Core 實現(xiàn) .NET 標準 API,隨著時間的推移,將包含更多 .NET Framework BCL API。
- 子系統(tǒng) -- .NET Core 實現(xiàn) .NET Framework 中子系統(tǒng)的子級,目的是實現(xiàn)更簡單的實現(xiàn)和編程模型。 例如,不支持代碼訪問安全性 (CAS),但支持反射。
- 平臺 -- .NET Framework 支持 Windows 和 Windows Server,而 NET Core 還支持 macOS 和 Linux。
- 開放源 -- .NET Core 屬于開放源,而 .NET Framework 的只讀子集屬于開放源。
雖然 .NET Core 是唯一的且與 .NET Framework 和其他 .NET 實現(xiàn)大不相同,但使用源或二進制共享技術分享代碼仍很簡單。
與 Mono 比較
Mono 是原始的跨平臺和 開放源 .NET 實現(xiàn),于 2004 年首次發(fā)布。 可以把它看作是 .NET Framework 的社區(qū)克隆。 Mono 項目團隊依賴于 Microsoft 發(fā)布的開放 .NET 標準(尤其是 ECMA 335),以便實現(xiàn)兼容性。
.NET Core 和 Mono 的主要差異在于:
- 應用模型 -- Mono 通過 Xamarin 產(chǎn)品支持 .NET Framework 應用模型(例如,Windows Forms)和其他應用模型(例如,Xamarin.iOS)的子集。 而 .NET Core 不支持這些內(nèi)容。
- API -- Mono 使用相同程序集名稱和組成要素支持 .NET Framework API 的 大型子集。
- 平臺 -- Mono 支持很多平臺和 CPU。
- 開放源 -- Mono 和 .NET Core 兩者都使用 MIT 許可證,且都屬于 .NET Foundation 項目。
- 焦點 -- 最近幾年,Mono 的主要焦點是移動平臺,而 .NET Core 的焦點是云工作負荷。