本篇文章主要介紹了.NET Core,.NET Core是一個開源通用的開發架構,支援跨平台,即支援在Window,macOS,Linux等系統上的開發和部署有興趣的可以瞭解一下。
1. 前言
.NET發行至今已經過了十四個年頭。隨著版本的不斷迭代更新,.NET在Windows平台上的表現也是越來越好,可以說Windows平台上所有的應用類型.NET幾乎都能完成。
只是成也Windows,敗也Windows,這十四年來,除了部分“民間”版本,.NET一直沒能在官方支援下擺脫Windows平台的局限,“開源”和“跨平台”這兩個詞語也是所有.NET開發人員心中的痛楚。最終,.NET Core出現了,它讓開發人員們在官方和社區的支援走出了Windows,可以在macOS,Linux主流distributions上編寫調試並部署.NET程式。
2. .NET Core 簡介
2.1 .NET Core是什麼
.NET Core是一個開源通用的開發架構,支援跨平台,即支援在Window,macOS,Linux等系統上的開發和部署,並且可以在硬體裝置,雲端服務,和嵌入式/物聯網方案中進行使用。.NET Core的源碼放在GitHub上,由微軟官方和社區共同支援。
它和傳統的.NET Framework,屬於“子集—超集”的關係,或者你也可以簡單地認為它就是.NET Framework的跨平台版本(基於BCL的層面上看)。這是因為在目前的版本中(1.0),.NET Core中的大部分核心代碼都是從.NET Framework中繼承重寫的,包括Runtime和Libraries(如GC, JIT, 部分類型)。
吐槽:只能感謝微軟《CLR via C#》不用白看呀,我之前看了得有小半年才看完
現在的.NET Core 1.0版本是一個很小的核心,APIs和工具也並不完整,但是隨著.Net Core的不斷完善,補充的Apis和創新也會一起整合到.NET Framework中。也就是說,.NET Core微軟會同時更新.NET Framework和.NET Core,他們就像倆兄弟,共同努力致富(致誰的富?當然是.NET開發人員們),實現所謂的天下大同,也就是.NET 標準2.0
這裡不得不提到一個叫做.NET Standard Library概念。作為.NET平台APIs開發官方支援標準,它要求所有的.NET架構APIs都遵循向下相容。比如說.NET Framwork 4.6支援.NET Standard Library 1.3,.NET Framwork 4.6.2架構支援.NET Standard Library 1.5,而.NET Core 1.0架構支援1.6標準。
最終展望如下:
2.2 .NET Core的組成
①.NET Runtime
即CoreCLR。如之前所說,CoreCLR與.NET Framework的CLR並沒有什麼區別,進程管理,GC,JIT(RyuJIT 編譯器)這些部分也都是一樣的,只是針對伺服器系統做了相應最佳化。現在CLR和CoreCLR也在進行同步更新,只是可以肯定的是,CoreCLR才是.NET的未來,CLR將作為相容手段而存在
②Framework Libraries,
即CoreFX。包括集合類,檔案系統處理類,XML處理類,非同步Task類等
③SDK Tools 和 Language Compilers (SDK工具和編譯器)
即CLI工具和Roslyn編譯器。可以通過.NET Core SDK(.NET Core開發套件)擷取。
④dotnet'app host
用來選取並執行對應運行時,提供組件載入原則和啟動.NET Core應用程式。SDK也是通過相同程式啟動。
Tips:是不是想起了MSCorEE.dll這個墊片,它同樣承載著Windows平台上為.NET應用程式選擇CLR版本的工作
2.3 .NET Core的特性
①跨平台
可以在Windows,macOS,Linux上運行
②靈活的部署機制
1.Portable applications(攜帶型應用)
這種部署機制和傳統的.NET Framework相似,只要目標平台上存在.NET Core Runtime即可。
2.Self-contained application(自宿主應用)
顧名思義,這種部署機制將應用和運行時共同打包,即便目標平台上沒有安裝.NET Core Runtime也能正常使用
第二種方式和.NET Native也是不一樣的,仍然使用CoreCLR,而.NET Native使用CoreRT作為運行時,詳細資料請見dotnet/corert
③命令列工具
.NET程式所有的運行指令碼都可以用命令列工具執行(cmd,bash)這裡有幾個常見的donnet命令
指令 |
協助 |
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 包 |
④相容性
通過.NET Standard Library與.NET Framework,Xamarin,Mono相容
⑤開源
.NET Core從屬於.NET基金會,由微軟進行官方支援。使用MIT和Apache 2開源協議,文檔協議遵循CC-BY
2.4 開發語言
.NET Core 1.0版本中支援的程式設計語言僅有C#(F#和VB暫未實現),這裡還要提到一個開源的語言編譯器Roslyn,它負責將代碼編譯成我們熟悉的IL語言,然後再藉由AOT或JIT編譯器編譯成機器熟悉的機器語言。
3. Get Started
以下內容示範在Windows10和CentOS 7.2下的命令列產生和發布demo
3.1 Win 10
3.1.1 安裝.NET Core SDK和.NET Core Runtime
.NET Core SDK = 使用.NET Core開發應用.NET Core Runtime 和 SDK+CLI 工具
3.1.2 簡單的運行結果
開啟cmd,依次輸入mkdir .project(建立目錄),cd .\.project(進入目錄),dotnet new(建立初始項目),dotnet restore(還原依賴),dotnet run(運行)即可運行第一個Hello World程式
3.2 CentOS 7.2(本地Hyper-V)
3.2.1 安裝和運行
詳情請見:www.microsoft.com/net/core#windowsvs2015,大致命令如下
sudo yum install libunwind libicu #安裝libunwind,libicu包curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=809131 #下載dotnet-dev-centos-x64.1.0.0-preview2-003121.tar檔案,有時會因為網路問題下載較慢,耐心等待即可,當然也可以手動下載後放到目錄下。sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet #建立目錄並解壓已下載檔案sudo ln -s /opt/dotnet/dotnet /usr/local/bin #將目錄連結到$PATH下,否則dotnet命令無法識別mkdir hwappcd hwappdotnet new #建立預設.NET Core應用dotnet restore #還原依賴包dotnet run #運行,結果將顯示Hello World!
第六行命令後可使用dotnet --info查看是否連結成功,顯示如下
.NET Command Line Tools (1.0.0-preview2-003121)Product Information: Version: 1.0.0-preview2-003121 Commit SHA-1 hash: 1e9d529bc5Runtime Environment: OS Name: centos OS Version: 7 OS Platform: Linux RID: centos.7-x64
以上步驟在.NET Core官方網站都可以找到,可以看到應用在經過簡單的dotnet new, dotnet restore, dotnet run命令後就跑起來了,但是這其實是類似於開發環境中的調試運行,而且win上new的應用此時也不能直接跨平台到Linux下運行,所以我們又得提到dotnet publish命令了
3.2.2 Self-contained applications 發布
(1) 修改project.json檔案
我們現在win10下按照步驟new一個新的HW控制台應用self,按照官方文檔要求,我們需要用以下內容替換原來project.json檔案(刪除"type": "platform",並增加runtimes節點)
{ "version": "1.0.0-*", "buildOptions": { "debugType": "portable", "emitEntryPoint": true }, "dependencies": {}, "frameworks": { "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "version": "1.0.0" } }, "imports": "dnxcore50" } }, "runtimes":{ "win10-x64":{}, #win10平台 "centos.7-x64":{} #centos7.2平台 }}
(2) 執行restore和publish操作
之後執行dotnet restore指令,針對平台進行還原作業。該步操作耗時較久,雖然只是兩個平台,第一次也花了較長時間。緊接著進行進行dotnet publish -r centos.7-x64 -c release。
dotnet publish指令詳見dotnet-publish - Packs the application and all of its dependencies into a folder getting it ready for publishing
(3) 在Linux平台上運行
上述操作後,我們只需要將發布後的檔案夾(bin/release/netcoreapp1.0/centos7-x64/publish,包含self.exe)上傳到Linux root目錄下project(建立)檔案夾中, 在Shell中輸入指令
修改可執行許可權後,即可成功運行“Hello World”,這就是我們“Self-contained applications”方式的部署方法
4. 總結
4.1 尾聲
至此,.NET Core的學習便告一段落了,以上內容簡單介紹了.NET Core的組成和特性,同時也在Windows和Linux系統上通過兩種不同的部署方式成功運行了樣本。相比較之前的.NET Framework傻瓜式部署,.NET Core的新奇真是讓我眼前一亮。接下來,我也會將.NET Core和ASP.NET Core的學習記錄下來,歡迎指正。