本文已經同步到微信公衆號「極客起源」 。編程
如今都在談論全場景開發,也就是用一套開發工具,能夠開發包括但不限於桌面、移動、IOT、遊戲、Web等平臺的應用。這樣對於開發人員是很是爽的。本文將介紹微軟推出的開發平臺:.net 5,這個開發平臺將完美地知足咱們的各類開發需求。.net 5也是.net家族的下一代產品。json
咱們只須要使用.net 5,就能夠爲Windows、Linux、macOS、iOS、Android、tvOS、watchOS、Web等平臺開發應用,是否是很酷呢?本文會介紹一下.net 5的一些新特性。並親手開發咱們的第一個基於.net 5的程序。
從.NET Core項目開始以來,微軟已經向該平臺添加了大約五萬個.NET Framework API。 .NET Core 3.0爲了縮小與.NET Framework 4.8的功能差距,添加了Windows Forms,WPF、Entity Framework6等功能。.NET5在此基礎上,利用.NET Core和Mono的優點建立了一個單一平臺,你能夠將其用於全部的現存的.net代碼,一個完整的與.net framework平齊的跨平臺開發平臺終於誕生了。安全
微軟計劃在2020年11月發佈.NET 5的正式版,目前已經發布了.NET 5的預覽版。
1. .NET 5 = 下一代.NET Core
.NET 5是.NET Core的下一步計劃。 該項目旨在經過一些下面的一些方式來改進.NET:
(1)擁有單一的.NET運行時和框架,該框架可在任何地方使用,並具備統一的運行時,開發者在任何地方均可以使用他們的開發經驗;
(2)經過充分利用.NET Core,.NET Framework,Xamarin和Mono來擴展.NET的功能;
(3)用單個代碼庫構建該產品,開發人員(Microsoft和社區)能夠一塊兒工做並一塊兒擴展,從而改善了全部方案;
這個新的項目和方向改變了.NET的遊戲規則。 使用.NET 5,不管您要構建哪一種類型的應用,代碼和項目文件的外觀看起來都是同樣的。 你將可使每一個應用程序訪問相同的運行時,API和語言特性。 這包括幾乎天天都致力於corefx的新性能改進。
固然,目前.net core擁有的仍然繼續存在並完善,例如:
(1)在GitHub上的開源和麪向社區;
(2)跨平臺支持;
(3)支持利用特定於平臺的功能,例如Windows上的Windows Forms和WPF以及從Xamarin到每一個本地平臺的本地綁定;
(4)高性能;
(5)並排安裝(多個.net core版本共存);
(6)多種開發工具(Visual Studio、Visual Studio for Mac和Visual Studio Code);
下面是.net 5的一些新特性:
(1)在運行時體驗上有更多選擇(見下面的內容);
(2)Java互操做性將在全部平臺上可用;
(3)在多個操做系統上將支持Objective-C和Swift的互操做;
(4)CoreFX將獲得擴展,以支持.NET的靜態編譯(ahead-of-time – AOT),佔用更小的空間以及對更多操做系統的支持;
計劃2020-11發佈.net 5.0的正式版,之後打算每一年11月發佈一個主要的版本,下圖是.net的發佈計劃表。也就是說,明年的11月份,咱們將迎來.net 6.0 LTS。其中LTS是長期支持版。
可能有的同窗會注意到,爲何沒有.NET 4呢?這裏直接跳過了第4版,是由於它會使熟悉.NET Framework的用戶感到困惑,.NET Framework已經使用4.x系列已有很長時間了,此外,微軟想清楚地傳達.NET 5是.NET平臺的將來。
除此以外,微軟還藉此機會簡化了命名。 微軟認爲,若是隻推出一個.NET,就不須要像「core」這樣的澄清術語。 簡稱是一種簡化,也代表.NET 5具備統一的功能和行爲。 若是願意,能夠繼續使用「 .NET Core」。這就意味着之後微軟官方正式的名字再也不有core,而是.NET 六、.NET 7等。
2. 微軟的野心與運行時們
微軟一直想統一各個平臺的開發框架,如今終於經過.net 5得以實現。這樣微軟就能夠爲將來的新平臺以近乎零成本移植程序了。而這一切都是從一個跨平臺運行時Mono開始的!
Mono是.NET的原始跨平臺實現。它最初是.NET Framework的開源替代方案,並隨着iOS和Android設備的流行而轉變爲能夠開發Android和iOS App。這樣Mono就做爲了Xamarin的運行時 成爲了Xamarin的一部分。
CoreCLR是用於.NET Core的運行時。它的主要目標是支持雲應用,包括微軟最大的服務,如今也用於Windows桌面,物聯網和機器學習應用程序。
綜上所述,.NET Core和Mono運行時有不少類似之處(畢竟它們都是.NET運行時),但也具備寶貴的獨特功能。使選擇所需的運行時體驗變得有意義。如今微軟正在互相替代CoreCLR和Mono。以便讓它像構建開關同樣簡單,能夠在不一樣的運行時選項之間進行選擇。
下面的內容描述了微軟計劃爲.NET 5設計的主要特性。它們提供了清晰的視圖,說明了微軟計劃如何分別以及一塊兒發展兩個運行時。
3. 高吞吐量與高生產率
從一開始,.NET就依靠即時編譯器(JIT)將中間語言(IL)代碼轉換爲優化的機器代碼。從那時起,咱們就創建了行業領先的基於JIT的託管運行時,該運行時具備很高的吞吐量,而且還爲開發人員提供了使編程變得快速簡便的體驗。
JIT很是適合長期運行的雲和客戶端方案。他們可以生成針對特定機器配置(包括特定CPU指令)的代碼。 JIT還能夠在運行時從新生成方法,該技術用於快速JIT,同時若是能夠成爲一種常用的方法,還能夠選擇生成代碼的高度優化版本。
開發者工具是JIT的另外一個很好的例子,例如dotnet watch工具對代碼編輯並繼續運行。工具一般須要在一個進程中屢次編譯和加載代碼,而無需從新啓動,所以須要很是快速地執行。使用.NET Core或.NET Framework的開發人員主要依靠JIT。所以,這種體驗應該看起來很熟悉。
大多數.NET 5工做負載默認使用基於JIT的CoreCLR運行時。 iOS和客戶端Blazor(Web程序集)是兩個值得注意的例外,由於它們都須要提早(AOT)本機編譯。
4. 快速啓動,佔用更少的空間以及和使用更少的內存
Mono Project已將大部分精力集中在移動和遊戲機上。該項目的關鍵功能和成果是基於業界領先的LLVM編譯器項目的.NET AOT編譯器。 Mono AOT編譯器使.NET代碼能夠內置到能夠在計算機上運行的本地可執行文件中,這與C ++代碼很是類似。 AOT編譯的應用程序能夠在較小的地方高效運行,並在須要時交換吞吐量以進行啓動。
Blazor項目已經在使用Mono AOT。這將是過渡到.NET 5的首批項目之一。微軟會將其用做證實該計劃的方案之一。
AOT解決方案有以下兩種:
(1)須要100%AOT編譯的解決方案;
(2)其中大多數代碼都是AOT編譯的,可是可使用JIT或解釋器並將其用於對AOT不友好的代碼模式(如泛型);
Mono AOT支持兩種狀況。一般,出於安全緣由,Apple對於iOS和某些遊戲機要求使用第1類AOT。第2個是首選,由於它提供了AOT的優勢而沒有任何缺點。
.NET Native是咱們用於Windows UWP應用程序的AOT編譯器,而且是上面列出的第一類AOT的示例。經過該特定實現,限制了你可使用的.NET API和功能。
iOS,Web程序集和某些遊戲機仍須要AOT編譯。對於須要快速啓動和/或佔用低空間的相似設備的應用程序,AOT編譯將稱爲成爲一種選擇。
5. 開發第一個基於.NET 5的應用程序(包含斷點調試功能)
到如今爲止,咱們已經瞭解了.NET 5的基本功能和目標,以及新特性。是時候開始操練一下了。開發.net應用的IDE有以下3個:
(1)Visual Studio(Windows)
(2)Visual Studio for mac(macOS)
(3)Visual Studio Code(跨平臺)
若是使用前兩個IDE,須要安裝2019及以上版本,並且這兩套IDE比較大,安裝須要更長的時間。若是隻是學習C#和.NET 5的API,推薦使用Visual Studio Code,這款IDE更輕量,並且使用起來並不比Visual Studio遜色。
在正式開發以前,先要安裝.NET 5,讀者能夠到下面的頁面下載.net 5的最新版(注意本身用的OS平臺)。
.net 5支持的CPU架構很是全,以下圖所示。若是用Linux或Windows,能夠選擇x86架構或ARM架構的機器。
下載完,直接安裝便可,這個不用猶豫,由於so easy,這裏就不詳細介紹安裝過程了。本文使用的是macOS版本的.net 5,其餘平臺的.net 5版本的使用方法相似。
安裝完.net 5後,能夠在終端輸入下面的命令測試一下是否安裝成功。
dotnet --version
若是輸出以下內容,說明.net 5已經安裝成功。
5.0.100-preview.8.20417.9
接下來到下面的頁面去下載Visual Studio Code吧。
讀者須要根據本身使用的操做系統平臺下載特定版本的Visual Studio Code,以下圖所示。下載完了,直接安裝或運行便可。
Visual Studio Code一開始並不支持.net 5開發,須要安裝各類插件。如今打開Visual Studio Code,切換到插件頁面(點擊左側第5個按鈕),並在插件搜索欄中輸入C#,會列出以下圖所示的插件。第1個是必須安裝的,其餘一些包含C#的插件,你們能安裝就安裝一下吧,多多益善,反正我是大多數都安裝了。右側顯示綠色「安裝」按鈕的是還未安裝的插件,沒有該按鈕的是已經安裝的插件,點擊插件,會在右側顯示插件的詳細信息。微信
![](http://static.javashuo.com/static/loading.gif)
Visual Studio Code的工程是以文件夾形式管理的。第1次打開Visual Studio Code,是以下圖這樣的。點擊「打開文件夾」按鈕打開一個文件夾,就至關於打開一個工程了,若是是個空文件夾,那麼就是空工程。也能夠先創建一個空文件夾,而後再打開該文件夾
架構
這裏新建立一個名爲first的文件夾,而後打開該文件夾,以下圖所示。當鼠標放到文件夾上時,右側會顯示4個按鈕,其中第2個是新建子文件夾。
如今在first下新建一個名爲src的子文件夾,而且在該文件夾的右鍵菜單中點擊「在集成終端中打開」,以下圖所示。框架
這時會在右下角打開一個終端,在終端輸入dotnet new console命令,會建立一個控制檯.net工程,若是輸出以下圖所示的信息,說明建立.net工程成功了。機器學習
這時應該在src目錄中生成一堆文件和目錄,若是Visual Studio Code左側工程樹沒有刷新,重啓一下就出來了。在生成的若干文件中有一個Program.cs文件,是.net 應用的入口文件,由於該文件中有一個Main方法。已經有一行輸出文本的例子了,以下圖所示。工具
接下來在終端輸入dotnet run命令,系統就會編譯和運行當前的.net 工程,並輸出以下圖所示的結果。性能
![](http://static.javashuo.com/static/loading.gif)
不過如今都是經過命令行運行應用,很是不方便。其實Visual Studio Code也有直接經過IDE運行和調試的功能。如今切換到「運行」頁面,以下圖所示。學習
![](http://static.javashuo.com/static/loading.gif)
而後點擊「建立launch.json文件」連接,會彈出以下圖的選項列表,選擇第1個(.NET Core)。
![](http://static.javashuo.com/static/loading.gif)
這時會建立一個以下圖所示的launch.json文件。
還須要從新打開一下first工程,而後再次切換到「運行」頁面,會看到上方有一個運行按鈕,以下圖所示。
如今點擊「運行」按鈕,會在終端輸出運行信息,以下圖所示。
![](http://static.javashuo.com/static/loading.gif)
很明顯,程序的輸出信息也在裏面。
下面咱們來編寫一個用於計算階乘的C#程序,代碼以下:
using System;
namespace src
{
class Program
{
static int factorial(int n) {
if(n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
static void Main(string[] args)
{
Console.WriteLine("10! = " + factorial(10));
}
}
}
運行程序,會輸出以下內容:
10! = 3628800
固然,Visual Studio Code一樣支持斷點調試功能,只須要用鼠標單擊須要設置斷點的代碼行前面,就會顯示一個表示斷點的紅點,如今運行程序,程序就會停到斷點的位置,而後能夠單步跟蹤代碼了,以下圖所示。
本文是關於.net 5和C# 9的第1篇文章,後續將推出系列文章,詳細介紹如何用Visual Studio Code、Visual Studio 201九、.NET 5以及C# 9開發更復雜的應用。