ASP.NET vNext or .NET vNext?
vNext在曝光以來絕大多數以ASP.NET vNext這樣的的字眼出現,為什么這邊會提及.NET vNext?原因是我認為ASP.NET只是其中的一種開發框架而已,其中真正核心重要的乃是底層的支撐層,至於底層還有些什么內容,下面會進行一次分析。
.NET Framework、Mono、.NET Core都是什么鬼?
相信有不少人對這一次vNext新誕生的名詞抱有許多疑惑,它們到底是做什么的?負責什么內容?扮演者什么樣的角色。
.NET Framework
這個我相信大家都不會感到陌生,做.NET平台相關的開發者都應該熟悉至少是了解其中的大概(雖然現在這樣的人還是占少數),.NET Framework整個架構圖非常大,但針對今天的主題細分為兩大塊:CLR(公共語言運行時)、FCL(框架類庫)。
CLR是負責執行IL(中間語言)而FCL則是微軟提供給開發者的快速開發類庫,這些代碼完全可以由開發者自己編寫與我們平常寫的代碼本質上並沒有多大的差異。
Mono
Mono與.NET Framework類似,是對於.NET Framework跨平台的移植,xamarin就是基於它的,也是風風火火。
.NET Core
今天的主角之一,.NET Fremework中的兩大塊CLR、FCL它也有,不過進行了更名與重構。
CLR被命名為:CoreCLR(.NET核心公共語言運行庫)
FCL被命名為:CoreFX(.NET核心庫)
在兩大塊面前大家先對號入座就好了。
CoreCLR
CoreCLR向外暴露了:Roslyn、LLILC(lilac)。
Roslyn
這個大家比較熟悉,它向C#、Visual Basic提供了豐富的代碼分析API和編譯器。一開始我以為C#、VB代碼到二進制代碼的編譯完全由它來完成,后面才發現它的背后有一個默默付出的功臣:LLILC,而它最主要的作用則是代碼分析編譯的動作是轉交給LLILC的。
LLILC
真正的編譯工作者。官方以后將提供:JIT(Just in time運行時編譯)、AOT(Ahead of time運行前編譯)兩種編譯方式。不過目前只有JIT,而AOT目前是Universal Windows Platform(UWP)的特權,相信不久的將來我們會迎來全平台的AOT。
JIT方式的編譯實現現在叫做:RyuJIT。
JIT編譯架構
AOT編譯架構
相比之前的特色
模塊化
在此之前大伙能想象CLR、FCL可以根據設定的版本號自動進行獲取嗎?而.NET Core基於模塊化這一特性實現了這一點,以后大伙不需要再提前安裝.NET Framework對應的版本而可以直接使用到不同版本的特性。這對於正在運行的服務器安裝新的.NET Framework或更新.NET Framework帶來了一次完美的解決,以后在使用.NET平台下新特性時不需要再擔心更新完成之后服務器是否需要重啟,因為這一切都是模塊化的可選擇性加載的。
跨平台
vNext發布之初最大的特性就是可以在Linux、OSX等操作系統上運行了,這也是大家覺得最需要醉激動的。但個人只是覺得跨平台是.NET這次革命以來帶來的一個成果、結果而已,並不讓我覺得很不可思議。
當然發展了許多年的.NET如今跨平台並不是毫無成本的,如果想要跨平台就意味着現在存在的小、中大型項目幾乎不可移植,具體的我們后面再看。
開放
這是特性是離我們最遠卻最有意義的一點(本質上說這不關平台的事,而是關乎於微軟)。這意味着我們可以為 CoreCLR(CLR)、CoreFX(FCL)進行貢獻以幫助.NET更加完善。
為什么說離我們最遠?作者也有開源一些項目深知想要為某個開源項目貢獻是一件多么不易的事情,而得到它人的貢獻更是一件特別特別難的事情。所以大多數開發者都不會用到此特性。
為什么最有意義?這一點很難說清,需要時間去證明,如果微軟能夠營造一個不錯的社區環境那么這一點以后一定會體現出來。
DNVM、DNX、DNU、KVM、KPM、KRE是些什么鬼?
我們先來看看每個縮寫的全稱和中文名稱。
DNVM:.NET Version Manager(.NET版本管理)
由於要實現跨平台的目錄,微軟提供了DNVM功能,DNVM是ASP.NET最底層的內容,它是一組Powershell腳本,用於啟動指定版本的ASP.NET運行環境,並且可以在同一台機器的同一時間點上通過使用Nuget工具來管理各種版本的ASP.NET運行環境(DNX),以及進行相應的升級操作。
之前我們提到模塊化的特性時有說過現在我們不需要到處去找.NET Framework安裝包去單獨安裝不同版本的.NET Framework了,而是由一個工具進行統一的管理(安裝、卸載、升級等),可以把它理解成一個“軟件管家”不過它目前只有一個軟件:.NET Core(不同的版本、CPU架構)。以后在開放項目時如果用了.NET Core v2版本,那么我們需要在服務器上使用該工具安裝.NET Core v2。(安裝過程非常的快,每個不同的版本包含了完整的.NET Core中提及的內容)
DNX:.NET Execution Environment(.NET執行環境)
DNX是ASP.NET程序的運行環境,用於啟動並運行ASP.NET程序。該運行環境包括了編譯系統、SDK工具集、Native CLR宿主環境。可以使用DNVM管理各種版本的DNX,如dnvm list命令可以列出所有可用的DNX環境,而dnvm install 1.0.0-beta4則可以將指定版本的DNX安裝到.dnx文件夾,你可以在%USERPROFILE%\.dnx\runtimes目錄下找到已安裝所有版本的DNX。不同的操作系統有不同的DNX版本。
dnx.exe:dnx.exe是用於啟動自宿主環境(Self-Hosting)的命令行工具,在使用命令行代碼進行自宿主環境啟動程序時,dnx負責查找並調用CLR Native Host,dnx命令是整個運行環境的入口點,你可以使用dnx run來啟動程序。
我們的代碼(C#、VB)是由.NET Core來執行的而.NET Core是由DNX來執行的。
DNU:DNX Utility(.NET執行環境實用工具)
是一個命令行的包管理器,包含在DNX內,所以只要安裝了DNX,就可以使用dnu命令,其可以用於恢復程序包、安裝程序包、部署程序包等等,比如把project.json里自定義的程序集自動下載下來進行使用。
用過NuGet的應該都清楚我們一般在VisualStudio中進行package的還原,其實NuGet提供了NuGet.exe,微軟應該考慮到了集成度才將NuGet.exe包含在了DNX當中,他的作用很簡單,為項目進行package的還原。
開發環境還原好了再發布就可以為什么正式環境還需要它?
vNext一直強調的是雲,我們一般在Windows下進行開發(擁有宇宙最強IDE),但線上環境其實是Linux這時候就需要根據不同的運行環境還原不同的package以便能正常運行。
KVM:K Version Manager(K版本管理)
KRE:K Runtime Enviroment(K運行環境)
KPM:K Package Manager(K包管理)
可以發現以D開頭的3個東西跟K開頭的三個東西名稱上非常的類似,到這里你想的沒錯,微軟的改名大隊又出動了,在此之前微軟將此項目命名為K項目,在此之后肯定要有個專業的名稱,微軟開發團隊對一些內容進行了職責和名稱划分。
架構圖
這一節的內容部分引用自:理解ASP.NET 5運行時命令:DNVM, DNX, 和DNU,在此感謝張善友前輩為我們提前探好了路。
.NET Framework 4.6和.NET Core 5
上面描述過.NET Framework是我們現在用的.NET框架,.NET Core是新一代的.NET框架,那么他們兩個的關系是什么?我們來看一張圖。
可以發現
.NET Framework 4.6
支持WPF、Windows Forms、ASP.NET(4&5)
.NET Core 5
只支持ASP.NET 5、Universal Windows Apps(UWP)
這邊有一個很有意思的事,Universal Windows Apps(UWP)微軟平台(PC、平板、手機)大統一戰略中最重要的一環使用的是.NET Core,不難發現.NET Core對於微軟來說的重要性。也是微軟了籌備了數年的成果。
寫在最后
參考資料
http://www.cnblogs.com/shanyou/p/4589930.html
http://www.cnblogs.com/shanyou/p/3764070.html
http://www.cnblogs.com/dudu/p/4257106.html
http://www.cnblogs.com/dudu/p/aspnet5-xre-cross-platform-secret.html
http://www.cnblogs.com/dudu/p/4245809.html
http://www.cnblogs.com/dudu/p/dotnet-core-framework-mono.html
http://www.cnblogs.com/dudu/p/what-is-dotnet-core.html
http://www.cnblogs.com/shanyou/p/4295163.html
http://www.cnblogs.com/dudu/p/what-is-dotnet-core.html
http://dotnet.github.io/core/
https://docs.asp.net/en/latest/conceptual-overview/aspnet.html
https://docs.asp.net/en/latest/conceptual-overview/dotnetcore.html
https://docs.asp.net/en/latest/dnx/overview.html
https://github.com/dotnet/coreclr
https://github.com/dotnet/corefx
https://github.com/dotnet/core
http://dotnet.github.io/core/about/overview.html
http://www.dotnetfoundation.org/netcore
這里感謝:張善友和dudu,感謝他們之前為我們探好了路。
交流方式
QQ群:384413261(RabbitHub)
Email:majian159@live.com