.NET平臺系列5 .NET Core 簡介

張傳寧發表於2021-05-13

  自1995年網際網路戰略日以來最雄心勃勃的事業 —— 微軟.NET戰略, 2000年6月30日。  

  微軟公司於2002年2月13日正式推出第一代.NET平臺 .NET Framewrok 1.0。藉助於自家強大易用的 Windows 系統,.NET Framework1.0 主要提供了面向 Windows 桌面(Windows Form)和伺服器(ASP.NET Web Forms)的基礎開發框架。在宇宙第一IDE(Visual Studio)中使用這兩款框架進行業務系統開發,框架中都提供了功能強大的控制元件、元件,開發者通過視覺化程式設計方式進行開發就非常容易上手,而且開發速度非常快,因此.NET平臺深受全世界開發者的喜愛,發展一路順風順水。

  在.NET(舊稱.NET Framework )發展過程中,其最大的競爭對手就是Java。Java是主打敏捷開發、跨平臺的程式語言,自1995年推出Java正式版以來,憑藉其天生的跨平臺(Windows、Linux、MacOS)優勢,發展至今在全世界開發者市場與生態圈層面遠遠超過.NET平臺。.NET Framework 與 Windows 平臺深度繫結,無法做到跨平臺,所以一直處於被Java壓制的狀態。

  網際網路技術飛速發展至今,傳統的桌面程式與Web應用已無法滿足各行各業的多場景應用需求。雲端計算、人工智慧、大資料以及雲原生等新興技術方向在現代IT時代掀起了一波又一波浪潮。傳統的 .NET Framework 技術極大地限制了.NET平臺的應用範圍與發展,面對如此尷尬的局面與現狀,微軟審時度勢,於2014年推出跨平臺解決方案.NET Core。

  2014年11月12日,微軟ASP.NET之父Scott Guthrie 在 Connect 全球開發者線上會議上宣佈,微軟將開源全部的.NET Core 執行時,並將.NET 擴充套件為可在Linux和maxOS平臺上開發與執行,從而讓.NET應用實現跨平臺。

dotnet/runtime 開源地址:https://github.com/dotnet/runtime

dotnet/core 發行日志:     https://github.com/dotnet/core/tree/main/release-notes

dotnet SDK 下載地址:     https://dotnet.microsoft.com/download

  .NET Core 的推出是微軟.NET技術發展史上又一個重要里程碑。.NET Core是.NET技術的重要變革,它將全世界.NET開發者帶入一個全新的開發領域。

1、.NET Core 定義

  .NET Core is a free, cross-platform, open-source developer platform for building many different types of applications. 這是微軟官方給出的定義:.NET Core是一個免費、跨平臺、開源的開發平臺,用於構建許多不同型別的應用程式。

  .NET Core 設計目標有包含:

  • 支援或可以移轉 (port) 到更多的作業系統平臺與晶片架構 (未來專案會跨出 x86 平臺。目前已至此x64、arm)。
  • 具有引人注目的效能與高可靠度。
  • 開發人員能快速與直接的獲取 .NET Core 開發環境。
  • 在直覺與具生產力的情況下建造應用程式,使用檔案,示例與 NuGet 元件。
2、.NET Core 核心功能

  .NET Core 是由許多專案所組成,除了基本的類庫(Core FX) 之外,也包含採用 RyuJIT 編譯的執行平臺 Core CLR、編譯器平臺.NET Compiler Platform、採用 AOT 編譯技術執行最優化的包 Core RT (.NET Core Runtime),以及跨平臺的 MSIL 編譯器 LLILC (LLVM-based MSIL Compiler) 等專案。
  同時,微軟也發展了一個建置技術檔案的平臺docfx, 並運用於 .NET Core 的檔案網站。

  • Roslyn  

  .NET Compiler Platform (專案程式碼為 Roslyn) 是將 .NET平臺的編譯架構標準化的平臺,它可提供程式管理工具 (如整合開發環境) 相當多的情報,用以發展有助於編寫程式與管理程式結構所需要的功能,例如型別資訊、語法結構、參考連結、語義、編譯器、自動化、錯誤回報等等功能,只要是遵循 CLI 標準的程式語言,都可以利用 .NET Compiler Platform 實現出編譯器,讓程式管理工具能實現如語法提示、語法自動完成、關鍵字高亮等視覺化能力。

  .NET Compiler Platform 可同時支援 .NET Framework 4.6 以上版本,.NET Core 也原生支援。

  • RyuJIT

  RyuJIT 是微軟發展的新式即時編譯器 (Just-in-Time Compiler),用以替換現有的 .NET Framework 的 JIT 以及 JIT64 即地編譯器,依據微軟公佈的測試報告,RyuJIT 的效能較前一代的 JIT 提升約 25%,並支援SIMD(Single Instruction, Multiple Data) 的技術。RyuJIT 同時應用於 .NET Framework 4.6 以及 .NET Core  。

  • Core CLR

  Core CLR 移植 .NET Framework 的 CLR 的功能,包含核心程式庫 mscorlib、JIT 編譯器、垃圾收集器 (GC) 以及其他執行 MSIL 所需要的執行期環境。

  • Core RT

  Core RT 是以AOT (Ahead-of-time) 編譯方式為主的核心功能,在 .NET Core 內稱為 Core RT,在 UWP 則是稱為 .NET Native。
  Core RT 會在建造時期 (非執行期) 在編譯時將 MSIL 轉換成平臺本地的機器碼,以獲取較短的引導時間 (JIT 採用的是執行時期編譯,使得引導時間拉長),以及記憶體用量減少的優點。Core RT 會在不同的平臺使用不同的 AOT 技術:

         · Windows 上使用的是 .NET Native。
         · macOS 與 Linux 上使用的是 LLILC (同時支援 JIT 和 AOT)。

  • LLILC

  LLILC (LLVM-based MSILCompiler,英文發音為 "lilac") 是 .NET Core 在非 Windows 平臺的 MSIL 編譯器 ,基於 ECMA-335 (Common Language Infrastructure) 的標準將 MSIL 編譯成原生碼執行,適用於可執行 LLVM 的作業系統,例如 macOS與 Linux 作業系統。LLILC 同時支援 JIT (內含 RyuJIT 的實現) 以及 AOT (未來將開始支援) 的編譯方式。

  • CoreFX(.NET Core Libraries)

  CoreFX主要包含數個公共庫,例如 System.Collections, System.IO, System.Xml等。CoreFX是 .NET Standard Library 的實現,同樣的.NET Framework 4.6.3也是基於.NET Standard Library的實現。它們目前都是基於.NET Standard Library1.6版本,具體見下表:

 

  開源地址:https://github.com/dotnet/corefxlab

3、.NET Core 包管理

  .NET Core 的類庫採用 NuGet 包化的架構,應用程式只需要使用 project.json 的 dependencies 區塊加入指定包版本的參考,就能獲得該包的功能,與以往 .NET Framework 大包式的提供方法完全不同。.NET Core 團隊宣佈己經有 98% 的 .NET Framework 主要類庫移轉到 .NET Core 平臺。

.NET Standard Library 是一個總括型的 NuGet Package,其內包含了這些類庫包:
  • Microsoft.DotNet.CoreHost
  • NETStandard.Platform
  • System.Collections.Concurrent
  • System.Linq
  • System.Runtime.Numerics
  • System.Text.RegularExpressions
其中的 NETStandard.Platform 也是一個總括型包,包含了下列類庫包:
  • Microsoft.NETCore.Platforms
  • Microsoft.NETCore.Runtime
  • Microsoft.Win32.Primitives
  • System.AppContext
  • System.Collections
  • System.Diagnostics.Debug
  • System.Diagnostics.Tools
  • System.Diagnostics.Tracing
  • System.Globalization
  • System.Globalization.Calendars
  • System.IO
  • System.IO.FileSystem
  • System.IO.FileSystem.Primitives
  • System.Net.Primitives
  • System.Net.Sockets
  • System.Reflection
  • System.Reflection.Extensions
  • System.Reflection.Primitives
  • System.Reflection.TypeExtensions
  • System.Runtime
  • System.Runtime.Extensions
  • System.Runtime.Handles
  • System.Runtime.InteropServices
  • System.Runtime.InteropServices.RuntimeInformation
  • System.Text.Encoding
  • System.Text.Encoding.Extensions
  • System.Threading
  • System.Threading.Tasks
  • System.Threading.Timer
開發人員只需要使用 NETStandard.Library 就能加入所有必要的 .NET Core 類庫參考,但若不需要這麼多元件,也可以只加入特定的包即可,不一定都要加入 NETStandard.Library。
4、.NET Core 支援的應用程式型別

  .NET Core 基於跨平臺能力,並沒有將與 GUI 高度相關的 API 移植到 .NET Core 內,因此像是Windows Forms或是Windows Presentation Foundation(WPF) 並未移植到 .NET Core。.NET Core 支援控制檯應用程式 (Console Application) 以及類庫 (Class Library) 型別的專案。

  不過微軟在其Universal Windows Platform(UWP) 開發平臺使用了 .NET Core ,並且利用 .NET Native 技術將其效能提升至十分接近原生碼的速度。
  ASP.NET Core 則以控制檯應用程式驅動其託管環境 Kestrel Server 以支援 ASP.NET Core 程式的執行。
  .NET CLI (Command-Line Interface) 指令列工具是 .NET Core 處理建造、執行與編輯工作的主要工具 ,有幾個主要的動作:

指令
幫助
dotnet new
產生新的基本 .NET 專案內容 (包含 project.json、Program.cs 以及 NuGet.config)
dotnet restore
還原所參考的 NuGet 包
dotnet build
建造 .NET 專案
dotnet publish
產生可發行的 .NET 專案 (包含所屬的 Runtime)
dotnet run
編譯與立即執行 .NET 專案 (較適用於 exe 型專案)
dotnet repl
引導互動式的對話
dotnet pack
將專案的產出封裝成 NuGet 包
 

提示:命令都是神一般的存在,我們凡人還是使用 Visual Studio 進行開發、編譯、釋出,效率最高。

5、.NET Core 與其他平臺的關係

  .NET Core 經常會拿來與其他平臺做類比,尤其是它的源頭 .NET Framework 以及另一個相似性質的開源平臺 Mono。

  .NET Framework
  據微軟的幫助文件介紹,.NET Core 和 .NET Framework 是子集 (Subset) 與超集 (Superset) 的關係,.NET Core 將會實現出部分的 .NET Framework 功能 (基本上是不含使用者介面的部分),例如 JIT (.NET Core 採用 RyuJIT)、垃圾收集器 (GC) 以及型別 (包含基本型別以及泛型型別等)。未來 .NET Framework 和 .NET Core 也將會是各自發展,但它們也會同時使用彼此的功能,例如 .NET Compiler Platform 與 RyuJIT 等技術。
 
  Mono
  Mono 是另一個已發展許久的 .NET Framework 跨平臺開源版本,基本上並不隸屬微軟官方,而是由社群的力量所主導,自成一個生態系統,也開發出了像Xamarin這樣的跨平臺.NET移動應用,.NET Core 與 Mono 未來會是合作的關係,Mono 仍會維持社群力量的維護與發展,而 .NET Core 則會以官方角度來進行發展,兩邊也會一起進行彼此功能上的增進 。
 
  與 ASP.NET Core 的關係
  .NET Core 與 ASP.NET Core 的關係其實一開始並不是主從關係  ,ASP.NET Core 的開發初期 (ASP.NET 5) .NET Core 還沒有開始起跑,因此 ASP.NET Core 當時有自己的執行期與工具,一開始稱為 Project K,後來改為 DNX (.NET Execution Environment),DNX 本身就具有可獨立運作的執行能力,不需要依賴 .NET Core 執行,但是這樣會變成 .NET Core 和 ASP.NET Core 雙頭馬車的現象,在 .NET Core 逐漸成熟之後,微軟也決定要將這兩個各自獨立發展的產品線整合在一起,DNX 也將因改用 .NET Core 執行期而終止開發,DNX 的功能將由 .NET Core 以及旗下的 .NET CLI 接替提供,整合後的版本將在 1.0 RC2 時釋出。
 
6、.NET Core 支援的作業系統

  下表列出了當前支援的 .NET 版本以及支援它們的 Windows 版本。 這些版本在 .NET 版本達到支援終止日期Windows 版本達到生命週期之前仍受支援。

Windows 10 版本終止服務日期按版本分段。 下表中僅考慮家庭版、專業版、專業教育版和專業工作站版。 檢視 Windows 生命週期事實表單,瞭解具體的詳細資訊。

    • 不支援的版本

        以下 .NET 版本 ❌ 不再受到支援:

                     

7、.NET Core 支援開發的應用程式
 

.NET Core/.NET6 平臺目前支援7大應用方向:桌面開發、網頁開發、遊戲開發、移動應用、雲端計算、物聯網IoT、人工智慧AI (機器學習ML.NET、大資料.NET for Apache Spark )。

參考連結

【1】https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md

【2】https://github.com/dotnet/corefx

【3】https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

【4】https://www.microsoft.com/net/core#windows

【5】https://msdn.microsoft.com/en-us/library/dn807190(v=vs.110).aspx

【6】https://blogs.msdn.microsoft.com/dotnet/2013/09/30/ryujit-the-next-generation-jit-compiler-for-net/

【7】https://zh.wikipedia.org/wiki/.NET_Core

相關文章