2017年10月25日 星期三

[.net framework 工程師看.net core][04]真跨平台.Net Core介紹

image
圖片來源:https://pixabay.com/en/annual-report-book-brochure-686343/

在上一篇介紹完C#之後(工程師的語言 C#),基本上對於.Net Framework的整個開發環境也是有個基本的了解和概念之後,在這篇將會對新的framework:.net core做個基本介紹。

.Net Core的組成

和.Net Framework一樣,當提到.Net Core的時候,這個平台提供了三個重要功能:

編譯/建制程式碼的工具

.Net core和.Net framework不同在於提供了一個所謂的dotnet cli工具(也可以稱為app host),這個工具提供了一個統一的api方便對專案做一些調整,並且提供像是build或者restore package的指令。

dotnet cli提供的還是一個wrapper,以compiler來說,底層其實用的也是Roslyn (.net Compiler platform)

.Net Core Base Class Library (BCL)

.Net Core和.Net Framework一樣,有提供了所謂的BCL。不過這個BCL其實從api的角度來說是少於.Net Framework,畢竟為了跨平台有些和Windows綁的很死的像是Windows Form就不包括在.Net Core的BCL。

CoreBCL也稱為CoreFx,有個github repo

Core Common Language Runtime (CoreCLR)
同.Net Framework一樣,也是有個CLR用來執行.Net Core的程式,不過這個CLR和.Net Framework不同,因此稱為CoreCLR
image
一樣CoreBCL和CoreCLR組成通常稱為runtime,也就是.Net Core。不過比較不一樣的是,這個runtime是由一個app host run起來的 (也就是所謂的dotnet的工具)

.Net Core和.Net Framework的不同之處

.Net Core基本上是.Net Framework的重寫,最主要目的/差異是:

達到真的跨平台
雖然理論上只要能夠run IL的CLR .Net 的程式就可以跨平台(例如 Mono就是一個這樣的CLR),但是微軟並沒有support。.Net Core的CLR則是有真的提供由微軟support的跨平台版本。
更“小”的程式組合
基本上.Net Core是一個更加模組化的平台,換句話說整體的速度和使用的資源更少。因此更符合現代化的Microservice的架構和Container模式執行的結構。
CLR執行方式的不同
.Net Core使用app host (dotnet cli)來吧 CoreCLR執行起來,而.Net Framework則不是用app host run起來。因此,.Net Core的console 程式發佈出來是.dll做結尾而不是.exe
發佈模式的不同

.Net Core有

  • Framework Dependent Deployment(FDD)
  • Self-contained Deployment(SCD)
兩種模式。

FDD和以前.Net Framework一樣,只有程式本身,需要執行的話那台電腦需要先安裝好.Net Core runtime。

SCD則是把.Net core runtime和程式包在一起,達到不需要有安裝.Net Core runtime就可以執行。

因此.Net Core在定義上面和.Net Framework不同,.Net Framework還是以Windows為主的架構並且提供豐富的api,而.Net Core則是更偏向以microservice跨平台的程式開發。

.Net Core安裝位置和內容

這個部分有:

  1. .Net Core可以安裝的模式
  2. .net Core的可安裝版本
  3. .Net Core的安裝路徑

.Net Core可以安裝的模式

和.Net Framework不同,.Net Core在安裝的時候分了兩個模式:

  • .Net Core SDK
  • .Net Core Runtime

.Net Core SDK包含了.Net Core Runtime的所有內容,並且多了一些和開發有關的工具。因此,如果要開發,就安裝SDK模式,如果只是要執行.Net Core的程式,那麼安裝 runtime即可。

這個和Java的JDK vs Runtime是一樣的概念。

關於準備.Net Core開發環境可以參考:[.Net Core 與 .Net Standard 實戰教學][Lab][01]準備環境

.Net Core的可安裝版本

.Net Core和.Net Framework不同,每一個版本都可以同時裝在一台電腦上面,因此更加容易使用和開發一樣的版本來run程式。

image
一台電腦可以安裝多個版本,並且Self Contained Deployment可以再沒有裝runtime的電腦執行起來
.Net Core發佈模式裡面的Self Contained Deployment可以包含runtime來發佈,可以達到電腦沒有裝runtime的情況下也可以跑程式

.Net Core的安裝路徑

預設安裝的路徑在:%programfiles%\dotnet\sdk

image
這台電腦裝了3個版本的.Net Core,1.0、1.1和2.0

.Net Core的版本

目前.Net Core進入到了2.0的時代,在這個版本裡面有個很重要.Net Standard也進入了2.0的版本。因此開發.Net Core變得更加容易(.net Standard在之後會在介紹)。

.Net Core 1.x的時代基本上處於一個比較不穩定的狀態,因為一切都還在確認中,假設有早期進入的就會發現一個很大的改變就是從csproj換到了project.json,然後又從project.json在換回了csproj。

因此如果有幸沒有碰過1.x時代,那麼基本上可以忽略直接從2.0進場。

.Net Core的執行方式

image
從source code到執行起來的過程
  1. 編譯程式碼 - .Net Core使用的compiler和.Net Framework一樣(至少是後來版本的一樣),都是使用.Net Compiler Platform (Roslyn)
  2. 編譯出來的結果是IL程式碼 - 如果包含exe的模式(SCD),exe會是app host
  3. 執行起來的時候,會搭配.Net Core的base library - CoreBCL
  4. 透過CoreCLR run 起來會用RyuJIT做及時編譯 並且變成機器碼被執行 - RyuJIT和.Net Framework的JIT在效能上面有加強
  5. 如果是UWP的程式,可以再編譯的時候透過AOT-Compiler直接變成機器碼,來達到執行速度的提升

結語

這篇介紹了.Net Core的一些基本情況,並且和.Net Framework做一些比較。希望透過這一篇能夠對.Net Core的整個環境有更加的了解。

是否目前就應該直接轉.Net Core?是否.Net Framework未來就會死掉呢?

基本上.Net Framework和.Net Core的對象不同因此不用擔心.Net Framework會死掉。至於是否進入.Net Core.....

在下一篇會對和.Net Core 2.0一起發佈的.Net Standard 2.0作介紹,如果還不確定是否要進入.Net Core,那麼可以先從擁抱.Net Standard 2.0開始。


沒有留言 :

張貼留言