終於開始了,微軟的野心將通過全場景開發平台dotnet 5體現得淋漓盡致!

 

 本文已經同步到微信公眾號「極客起源」 。

 現在都在談論全場景開發,也就是用一套開發工具,可以開發包括但不限於桌面、移動、IOT、遊戲、Web等平台的應用。這樣對於開發人員是非常爽的。本文將介紹微軟推出的開發平台:.net 5,這個開發平台將完美地滿足我們的各種開發需求。.net 5也是.net家族的下一代產品。

 我們只需要使用.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 6、.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#的插件,大家能安裝就安裝一下吧,多多益善,反正我是大多數都安裝了。右側顯示綠色「安裝」按鈕的是還未安裝的插件,沒有該按鈕的是已經安裝的插件,點擊插件,會在右側顯示插件的詳細資訊。

 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 工程,並輸出如下圖所示的結果。

 不過現在都是通過命令行運行應用,非常不方便。其實Visual Studio Code也有直接通過IDE運行和調試的功能。現在切換到「運行」頁面,如下圖所示。

 然後點擊「創建launch.json文件」鏈接,會彈出如下圖的選項列表,選擇第1個(.NET Core)。

 這時會創建一個如下圖所示的launch.json文件。

 

 還需要重新打開一下first工程,然後再次切換到「運行」頁面,會看到上方有一個運行按鈕,如下圖所示。

 

 現在點擊「運行」按鈕,會在終端輸出運行資訊,如下圖所示。

 

 很明顯,程式的輸出資訊也在裡面。

 
下面我們來編寫一個用於計算階乘的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 2019、.NET 5以及C# 9開發更複雜的應用。