ASP.NET MVC - ASP.NET MVC vNext ( MVC 6 ) Core CLR and .NET Core Framework

20 June 2014 — Written by Sky Chang
#ASP.NET#ASP.NET MVC#Azure#C##IIS#KVM

開始之前,還是要免責聲明一下…

這部分目前官方還是沒有提供很多詳細的敘述,所以多半是透過官方Blog的很多篇文章彙整起來的;其次,目前這都也還在Preview,未來依舊有可能會去改變和變化,所以這部份,大家參考看看就好。

Core CLR是這次ASP.NET vNext很重要的核心之一,官方這部分沒有講得很清楚,但基本上Core CLR就是一個精簡的CLR;拿掉了繪圖等等的一些功能,讓Server和Cloud有更高的效能,更低的記憶體使用,與高透通性。

另外,在講Core CLR的過程中,其實我覺得要和新的.NET Core Framework一起講;在官方的文章裡面,我看到的,通常Core CLR和.NET Core Framework是混再一起講;雖然目的上是一樣的 ( 也因為目的相同,所以我看到的文章都是混再一起說這件事情 ) ,但小弟實驗了一下,我覺得事有一些差異的,當然,這部份有沒有可能是小弟我自己腦補,未來也是要等官方證明。

.NET Core Framework

如下圖所示,我們可以從專案這邊選擇是要原本的.NET Framework或是.NET Core Framework;.NET Framework顧名思義就是一大堆的Lib,提供給我們方便的用途,但實際上,我們開發Web應用程式的時候,可能不需要使用到那麼多的Lib;所以才會有精簡版本的.NET Core Framework;另外一個用意,之前我們使用.NET Framework,多半需要安裝完整的套件,例如ASP.NET MVC,就要安裝ASP.NET MVC的安裝包,才能去做執行;也就是說,以前我們使用.NET Framework的時候,專案參考到的是GAC。

image

而.NET Core Framework則不會再去參考GAC,他的另外一個變革就是,要用多少載多少;所以就如下圖的Package包 ( 未來都會自動打包,這牽涉到Kruntime的一些東西,我們後面會再看到,這邊我們先關注 Framework ),我們可以看到.NET Core Framework這個包裡面,其實包了一堆原本會在GAC底下的東西…;的確,這樣的Package會比.NET Framework包起來大得多,但實際上,透過這種方式,再也不用和GAC相依、一個Server則可以run不同的dll版本、甚至Server上不用再裝類似ASP.NET MVC這種套件包,只要整個複製過去,就可以順利執行。

另外,這邊會打包成KRE-svrc50-x86 ( svrc的c是代表core的意思 )

image

這邊下圖是.NET Framework的Package,我們可以看到,完全看不到system.dll的蹤影,因為sysytem.dll會去吃GAC;當然,這也比較小包,但是就會和系統相依。

這邊則是KRE-svr50-x86。

image

除此之外,我們看一下Visual Studio裡面的應用,也可以看到.NET Framework完整版,可以找到system.managment這個namespace。

image_thumb[2]

而.NET Core Framework 則找不到…

image_thumb[5]

另外一個例子,.NET Core Framework找不到System.xml的時候。

image_thumb[8]

可以透過NuGet取得XML包。

image_thumb[10]

這時候自然而然就找到了。

image_thumb[13]

從上面那個例子,我們也可以看到,其實.NET Core Framework就已經把一個一個常用的Lib獨立出來,有需要的情況下再去載入~

但是,請注意,上面那個例子,你就不會找到system.management的package包,我不確定這部份未來官方會再補上去,又或是這牽涉到Core CLR…

但不管如何,我們先來談一下 Core CLR

Core CLR

CLR是.NET最終運行的地方,基本上完整的CLR,自然提供了完整的功能,而Core CLR則拿掉了一些用不太到的功能,來達到精簡與加快速度的目的。

而就如前面一開始說的,從目前的文章看到,幾乎都是會把.NET Core Framework與Core CLR一起談,但就小弟的觀點來看,兩件算是同一件事也不算是同一件事情;.NET Core Framework、.NET Framework指的是可以用哪一種的.NET Framework產生出大包、小包的Package包…而Core CLR和DesktopCLR指的是整個CLR能支援.NET Framework程度的完整性…

所以剛剛找不到system.management不知道算不算是Core CLR不支援這個Lib,但可以確定的是,從官方的影片可以看到,目前Core CLR不支援System.Draw;所以反過來說,Core CLR拿掉了很多用不到的地方…

所以,.NET Core Framework必須搭配Core CLR…而.NET Framework則要搭配Desktop CLR。

繼續往下看,下面的圖是官方那邊出來的,顯示了“雲優化”的架構(不考慮跨平台的特性)

另外,也要注意一下,目前官方有指出以下這段話。

Also, current plug of the Core-CLR on top of IIS is “Helios”, but there will be an IIS Native Module in the future, too.

目前在IIS之上必須要有Helio (太陽神) 這個套件,這個主要是配合OWIN而產生出來的一層;未來這部份官方也會實作IIS Native Module。

image

另外一張官方的架構圖,我們可以看到中間會有Loader。

是的,這是前面沒提到的一個東西,未來整個ASP.NET vNex runtime,除了CLR外,還會在CLR外面包一個Kruntime;所以前面那邊大家才會看到自動打包成KRE-xxx這種Package包,用途就是在執行的時候,才去處理與載入。

所以我們其實可以從下面這簡單的架構圖看到,在KRuntime的時候來解決要讀取哪個CLR ( 其實上面也會有Loader,只是上面那張圖專注於雲優化這件事情 )。

image

最後,我再補上兩張,使用.NET Framework 和 .NET Core Framework佈署到Azure的情況。

我們可以看到使用.NET Framework時,是run DesktopCLR。

image

如果是使用.NET Core Framework 則會使用CoreCLR。

image

大致上就這樣了,如有錯誤,歡迎告知小弟… (但請鞭小力一點QQ )

下一篇,來看看Kruntime。

參考資料

Sky & Study4.TW