1. 程式人生 > >終於開始了,微軟的野心將通過全場景開發平臺dotnet 5體現得淋漓盡致!

終於開始了,微軟的野心將通過全場景開發平臺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平臺)。   https://dotnet.microsoft.com/download/dotnet/5.0 .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吧。   https://code.visualstudio.com   讀者需要根據自己使用的作業系統平臺下載特定版本的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開發更復雜的應用。