天天看點

厚積薄發,擁抱 .NET 2016

<a></a>

<b>閱讀目錄</b>

<a href="http://www.cnblogs.com/OceanEyes/p/dotnet_2016_overview.html#_label0">初識 .NET 2016</a>

<a href="http://www.cnblogs.com/OceanEyes/p/dotnet_2016_overview.html#_label1">使用 .NET Framework 4.6 編譯應用程式</a>

<a href="http://www.cnblogs.com/OceanEyes/p/dotnet_2016_overview.html#_label2">使用 .NET Core CLI 編譯應用程式</a>

<a href="http://www.cnblogs.com/OceanEyes/p/dotnet_2016_overview.html#_label3">小結</a>

厚積薄發這個詞是高三英語老師在聯考前寫在黑闆上,高中三年努力這麼久,是時候迎面而上,沖刺向前。是以,一想到.NET 2016,腦海裡蹦出的第一個詞就是它。 .NET 2016 是 .NET 一次質的飛躍,不管難易,我們需要擁抱變化。

.NET 2016 概覽

.NET 2016 作為 .NET 技術最新發展,如下圖所示,它主要包含三大塊:

最左邊代表的是 .NET Framework 4.6,WPF、ASP.NET 4.x、ASP.NET Core 1.0 能運作在它上。中間這部分代表的是 .NET Core 技術,ASP.NET Core 1.0 和 Universal Windows Platform(UWP)能運作在它之上。當然,你也可以建立控制台應用程式運作在.NET Core 上。最右邊是 Xamarin,它是一個基于 Mono 的跨平台移動開發架構。

在.NET 2015 時,微軟為我們帶來了全新的 .NET,它就是.NET Core。.NET Core 的一個重要組成部分是新的運作時(Runtime):CoreCLR。除了使用 CoreCLR 運作時外,.NET 也能被編譯成 Native Code。UWP 自動使用這個特性,應用程式在送出到 Windows Store 後被編譯成 Native Code,最終生成優化過後的代碼,可以讓 APP 啟動時間加快并可以減少記憶體消耗 。你當然也能編譯其他.NET Core 應用程式成 Native Code,并在Linux運作。

在上圖的底部,你可以看到有一些東西在.NET Framework 4.6、.NET Core、Xamarin 之間共享。比如一些共享的Libraries,通過 Nuget 包的概念将這些 Libraries 彙集在 Package 中供所有的.NET 平台使用。還有一些運作時元件(Runtime Components)被共享,如 GC 和 RyuJIT,這是一個新的JIT編譯器,這個新的 JIT 編譯器不僅比以前更快,在調試時它還具有更好的支援編輯和繼續功能。這個功能可以在調試時編輯代碼并繼續調試,而不需要停止和重新啟動程序。CLR、CoreCLR、.NET Native 使用 GC 進行執行個體的銷毀以及記憶體的回收,并且 CLR 和 CoreCLR 使用 RyuJIT 編譯器将 IL 代碼編譯成 Native Code 。當然,新的編譯器 Roslyn 也是共享的。

.NET Framework 4.6

.NET Framework 4.6 作為 .NET Framework 的最新版本,在過去 10 多年間,不斷被增強。我們利用這個 Framework 建構 Windows Form 、WPF、ASP.NET 4 等應用程式。盡管 ASP.NET Core 應用程式運作在.NET Core 上,但它也能運作在.NET Framework 4.6 上。

如果你想要繼續使用 ASP.NET Web Form 開發應用程式,.那麼 NET Framework 4.6 中的 ASP.NET 4.6 是你的最佳選擇。值得注意的是你不能在.NET Core 上運作 ASP.NET Web Form 應用程式。

.NET Core 1.0

.NET Core 1.0(目前是 RC2),是新的.NET,相比于 Mono,它是真正意義上跨平台的實作。.NET Core 被設計成子產品化的方法,即被分割成大量的 Nuget Package。在應用程式中,你決定需要哪些 Package,并且随時保持更新和解除安裝。而.NET Framework,它是作業系統的一部分,注定不能實時被更新,同時,過去 10 多年件,.NET Framework 加入非常多的新功能,它變得越來越大,更糟糕的是,它不可能移除不再需要的舊功能。比如舊的集合類不再被使用因為泛型集合類加入,.NET Remoting 被新的通信技術 WCF、ASP.NET Web API 替換,LINQ to Sql 被 EntityFramework 替換。而這些舊技術,一直存在.NET Framework 中,你不得不全盤接受他們。

Xamarin

Mono 是開源社群開發的跨平台.NET Framework,而 Xamarin 是一個建構于 Mono 上跨平台移動應用開發架構。相信微軟收購了 Xamarin 之後,Mono 将得到大力支援,.NET Core 在移動端的表現拭目以待。

建立 “Hello World” 應用程式是學習一門新技術的開篇。在這兒,為了更好的去了解.NET Core,我們不打算去使用Visual Studio 2015 進行開發。

Developer Command Prompt 編譯代碼

當安裝完畢 Visual Studio 後,我們可以通過配套工具 Developer Command Prompt 使用 C# 編譯器編譯代碼。

1.打開記事本,使用 C# 編寫如下代碼,命名為 HelloWorldApp.cs 并儲存至 C:\Code 檔案夾

2.啟動 Developer Command Prompt for VS2015,鍵入如下指令:

進入 C:\Code 檔案夾 cd C:\Code

使用 C# 編譯器編譯源代碼 csc HelloWorldApp.cs

檢視檔案目錄結構 dir

輸入EXE 名來運作應用程式 HelloWorldApp

運作結果如下所示:

注意你的源代碼檔案 HelloWorldApp.cs,已經編譯到程式集HelloWorldApp.exe 中。當你輸入 HelloWorldApp 名來運作應用程式,最終被.NET Framework 4.6 和它的 CLR 加載并運作。

使用 ILDASM 反編譯程式集

1.C# 編譯器将源代碼轉換成IL代碼後存儲到程式集中(DLL 或者 EXE)。

2.IL 代碼語句就像彙編語言指令,它們被.NET 的虛拟機也就是 CLR執行。在運作時,CLR 從程式集中加載 IL 代碼,然後 JIT 編譯器編譯成 Native Code,最後交由 CPU執行。

在 Developer Command Prompt 輸入 ildasm HelloWorldApp.exe,你會看到ILDASM 工具加載編譯過後的程式集:

輕按兩下 MANIFEST 節點,檢視中繼資料:

可以看到.NET Metadata 的版本是 4.0.30319,并且依賴外部的程式集mscorlib,它的版本是4.0.0.0,上述截圖告訴我們,要運作這個應用程式需要安裝.NET Framework 4.0以上。

關閉 MANIFEST 視窗,再展開 Program 節點,輕按兩下 Main 方法:

注意IL 指令:ldstr(load string ),nop(no operation ),call,ret(return)。記住IL 最終被 CLR 執行。

成功安裝.NET Core CLI Tools 之後,可以在 Developer Command Prompt 鍵入 dotnet help 來 檢視具體使用:

使用 CLI 建立.NET Core 應用程式

你需要通過 Developer Command Prompt 使用如下指令:

1.再次進入 C:\Code 檔案夾 cd c:\code

2.建立新檔案夾 mkdir SecondApp

3.進入新檔案夾 cd SecondApp

4.使用 CLI 建立.NET Core應用程式 dotnet new

5.檢視目錄結構 dir

dotnet new 指令建立了一個新的.NET Core 應用程式,包含兩個檔案,分别是 Program.cs 和 project.json。

Program.cs 是個簡單的控制台應用程式,輸出“Hello World”

而另一個檔案:project.json,它是項目配置檔案,并以JSON的格式定義了應用程式的基本資訊,比如:version、buildOptions、authors、dependencies、frameworks 等。

上述JSON 格式中,由于 Main 方法作為應用程式的入口(Entry Point),是以需要将 buildOptions 節點下的emitEntryPoint 屬性設定為 true。

dependencies 節點代表應用依賴的 packages,預設情況下隻添加了 Microsoft.NETCore.App 的依賴。值得注意的是,Microsoft.NETCore.App 是一個引用類型的Nuget Package,它又引用了其他的Nuget Package。這樣的好處是避免添加大量的其他package。

frameworks 節點列出了應用程式支援的 frameworks。預設情況下,應用程式隻支援.NET Core 1.0,以别名 netcoreapp1.0 表示。netcoreapp1.0 下的 imports 節點 引用舊名稱 dnxcore50。這允許我們仍舊可以使用舊名稱的 package。

接着,通過dotnet restore 下載下傳所需要的依賴項

通過 project.lock.json,檢視具體下載下傳的 package 版本。

為了編譯應用程式,使用指令 dotnet build。

最後,使用 dotnet run 運作應用程式。

值得注意的是,在 framework 中也可以添加應用程式對其他 frameworks 的支援,添加字元串net46,表示目前的控制台應用程式建構于.NET Framework 4.6之上:

遺憾的是,dotnet build 之後,發生了異常。如下所示(注:目前版本是.NET Core RC 2),

dotnet build 之後,分别生成兩個檔案夾 net46 和 netcoreapp1.0,使用 ILDasm(見上一小節)工具,打開檔案夾可以看到他們之間一個很重要的差別,使用.NET Framework 的應用程式編譯之後為生成包含 IL 的 EXE 應用程式并且依賴mscorlib程式集 ,而使用.NET Core 的應用程式編譯之後生成包含 IL 的DLL,依賴System.Console 和 System.Runtime 程式集。

最後,通過 dotnet run --framework net46 指定 famework 的版本為.NET Framework 4.6 檢視運作結果。

除了 dotnet build 和 dotnet run 外,你還可以通過 CLI 打包(dotnet pack)和 釋出(dotnet publish)應用程式。

dotnet pack 建立了一個 NuGet Package:

它是一個字尾名為 nupkg 的 Nuget Package,你可以将它改為.zip,解壓檢視裡面的内容。

dotnet publish 釋出一個可用于部署.NET 項目,你可以在 project.json 添加 runtime :

告别.NET 開發一年多,沒想到發生了這麼多不可思議的技術,抓緊時間補充一下。我招過人,也求過職,深切體會到國内.NET 的生态環境不給力,希望.NET Core 的出現能為我們指向一條明路,就像森林裡一縷陽光,帶來希望。
厚積薄發,擁抱 .NET 2016

本文轉自木宛城主部落格園部落格,原文連結:http://www.cnblogs.com/OceanEyes/p/dotnet_2016_overview.html,如需轉載請自行聯系原作者

繼續閱讀