.NET 6 Preview 1 开箱,带你体验新版本
最近 .NET 6 Preview 1 發(fā)布了,.NET 統(tǒng)一是此版本的核心。大家可以讀一下原文博客:
https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/
.NET 6.0 SDK 和 Runtime 下載地址:
https://dotnet.microsoft.com/download/dotnet/6.0
下面筆者將給大家介紹一下 .NET 6 Preview 1 目前的更新內(nèi)容和上手嘗試一些好玩的更新。本文并非翻譯文章,純手工打造。
作者:癡者工良(原創(chuàng))
跨平臺 UI 應(yīng)用
.NET6 對多平臺(Android、IOS等)界面應(yīng)用程序做了統(tǒng)一,提供了在多種平臺和社保上一致的體驗,并且可以在移動應(yīng)用和 PC桌面程序之間共享更多的代碼。多平臺統(tǒng)一工具包是基于 Xamarin.Forms 的集成和拓展,使得我們可以開發(fā) Windows、MacOS、Android 和 IOS 桌面應(yīng)用。
目前 Visual Studio 支持 Windows 和 MacOS,在已經(jīng)安裝了 .NET6 SDK 的機器上,發(fā)布的桌面程序可以在 Windows 和 MacOS 上運行,如果要支持 Android 和 IOS ,則需要下載另外兩個包。這是因為 Windows 和 MacOS 可以通過安裝 .NET6 Runtime 去運行程序,運行的是 .dll 文件(IL中間代碼),而 Android 和 IOS 都是發(fā)布和運行本機代碼。
# Windows 下載 Microsoft.NET.Workload.Android.11.0.200.85.msi Microsoft.NET.Workload.iOS.14.3.100-ci.main.1079.msi# MacOS 下載 Microsoft.NET.Workload.Android-11.0.200-ci.master.85.pkg Microsoft.iOS.Bundle.14.3.100-ci.main.1079.pkg讀者可以到?https://github.com/dotnet/net6-mobile-samples?查找下載鏈接,發(fā)現(xiàn)不開代理下載不了,各位請注意。
.NET6 運行時有 android 和 ios 的特殊標(biāo)記,要支持移動應(yīng)用,需要指定名稱,如要支持 Android,在?.csproj?文件中:
<TargetFramework>net6.0-android</TargetFramework>下面是一個 Xamarin.Forms 應(yīng)用的?.csproj?模板:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>net6.0-android;net6.0-ios</TargetFrameworks><RuntimeIdentifier>ios-x64</RuntimeIdentifier><OutputType>Exe</OutputType></PropertyGroup><ItemGroup><PackageReference Include="Xamarin.Forms" Version="4.8.0.1364" GeneratePathProperty="true" /></ItemGroup> </Project>當(dāng)然,要發(fā)布或者調(diào)試程序,需要 SDK 或 仿真器,例如安卓需要 Android SDK 以及?Android SDK Platform 30,發(fā)布的時候也需要指定:
dotnet build HelloForms -t:Run -f net6.0-android dotnet build HelloForms -t:Run -f net6.0-ios官方的示例項目中,nuget 包需要訪問 pkgs.dev.azure.com,不代理訪問不了。因此,這個示例項目搞不了,大家看著過過癮就行。
目前 .NET6 Targeting 有:
net6.0
net6.0-android
net6.0-ios
net6.0-maccatalyst
net6.0-macos
net6.0-tvos
net6.0-windows
Blazor 桌面應(yīng)用
我想,看到這個更新,最開心的是 Ant Design of Blazor 項目的主導(dǎo)作者 James Yeung 吧。
.NET6 中,可以將 Blazor 拓展混合到 UI 應(yīng)用程序中,將 Web 和本機 UI 結(jié)合在一起,可以在桌面中嵌入運行。Blazor 混合開發(fā)的方式,稱為 Blazor Hybrid Apps。.NET Core 3.0 支持 Blazor Server,3.1 支持 Blazor WebAssembly,Blazor WebAssembly 使用 Mono 運行時,很多 .NETer 應(yīng)該體驗過 Blazor 開發(fā),WebAssembly 目前來看還是太大了(.NET Core 3.x),還有性能差等問題。后續(xù) .NET 版本對其進(jìn)行了大量優(yōu)化。
VS2019 Preview4 中這個模板名稱變成了 Blazor WebAssembly App ,實際上就是 WebAssembly,加上了 App 這個名稱,但是并不代表是 UI 程序,它依然是 web。
回歸正題,.NET6 更新的博客說這個 Blazor 可以跟 MAUI一起搞,但是博客并沒有提到 Demo 和實現(xiàn)細(xì)節(jié),可能還在繼續(xù)開發(fā)中,Preview 1 可能暫時看不了。那 TM 我下載 VS2019 Preview4 后,還是不能直接創(chuàng)建???耍我呢?怎么體驗這個 Blazor 開發(fā)桌面應(yīng)用?
不久前有人創(chuàng)建了這個 Issue:https://github.com/Webreaper/Damselfly/issues/108
不過,Blazor 倒是可以跟移動應(yīng)用搞一起,有個項目叫 Mobile Blazor Bindings,可以將 Blazor 結(jié)合到 Xamarin 中,這個項目在 .NET Core 3.x 就已經(jīng)支持了。
項目地址:https://github.com/dotnet/MobileBlazorBindings
示例代碼:
<StackLayout><Label FontSize="30">You pressed @count times </Label><Button Text="+1" OnClick="@HandleClick" /> </StackLayout>@code {int count;void HandleClick(){count++;} }這種項目,使用的是 Microsoft.MobileBlazorBindings.Templates 庫,這個庫封裝了大量的 Razor 組件。
我們可以通過 dotnet 命令來創(chuàng)建這種項目,對應(yīng)模板如下:
Template Name Short Name Language Tags ---------------------------------------------- -------------------- ---------- ------------------------ Experimental Mobile Blazor Bindings App mobileblazorbindings [C#] Blazor/Xamarin.Forms Experimental Mobile Blazor Bindings Hybrid App blazorhybrid [C#] Blazor/Xamarin.Forms/Webmobileblazorbindings 不好玩,大家不要試。
我們可以使用命令來創(chuàng)建模板項目:
dotnet new blazorhybrid目錄結(jié)構(gòu):
H:. ├─HBlazor │ ├─WebUI │ │ ├─Pages │ │ └─Shared │ └─wwwroot ├─HBlazor.Android │ ├─Assets │ ├─Properties │ ├─Resources │ └─wwwroot ├─HBlazor.iOS │ ├─Assets.xcassets │ ├─Properties │ └─Resources │ └─wwwroot ├─HBlazor.macOS │ ├─Assets.xcassets │ └─Resources │ └─wwwroot └─HBlazor.Windows└─wwwroot但是官方的示例項目有 Bug,而且項目莫名其妙異常,大家試著玩一下就行了。
這個原理是 Microsoft.MobileBlazorBindings 封裝了一系列的 razor 組件,然后我編寫 razor 文件,引用這些組件編寫界面以及動態(tài)操作。
測試代碼(Main.razor):
<ContentView><StackLayout><StackLayout Margin="new Thickness(20)" Orientation="StackOrientation.Horizontal"><Label Text="癡者工良" /><Image Source="@(new FileImageSource { File = "H:/文章/.NET6/mobileblazorbindings/HBlazor/Bugs.jpg" })" /><Label Text="@($"Bug - {CounterState.CurrentCount}")" FontSize="40" HorizontalOptions="LayoutOptions.StartAndExpand" /><Button Text="解決 Bug" OnClick="@CounterState.IncrementCount" VerticalOptions="LayoutOptions.Center" Padding="10" /></StackLayout><BlazorWebView VerticalOptions="LayoutOptions.FillAndExpand"><HBlazor.WebUI.App /></BlazorWebView></StackLayout> </ContentView>注:目前不支持 HTML 標(biāo)簽 如?<br />?,現(xiàn)在可以使用 Razor 語法,但是還不能直接使用 HTML。猜測可能是將 Razor 轉(zhuǎn)換到 Xaml ,所以只能使用里面已經(jīng)定義好的組件。怎么加入 CSS 也是個問題。這也說明了,不支持那些 js !
而 .NET6 博文中提到的 Blazor desktop apps,看界面樣子,應(yīng)該是網(wǎng)頁版本嵌入的。但是目前還不能嘗試,所以無法測試,跳過。
回顧一下跨平臺 UI 應(yīng)用,主要提到 Xamarin 和 Blazor,而 .NET6 會出現(xiàn)一個新的跨平臺 APP UI 框架,叫 MAUI,.NET MAUI是Xamarin.Forms 的演進(jìn),這個在 2020 年時就出現(xiàn)了。這個庫的目的是統(tǒng)一 Xamarin SDK 到 .NET 中,并且能夠與其它項目共享代碼(如Blazor)。
目前有兩種方式可以嘗試 MAUI:
Comet MVU -?https://github.com/clancey/comet
Blazor Mobile Bindings -?https://github.com/xamarin/MobileBlazorBindings
后者已經(jīng)提到了,MVU 這種讀者有興趣可以自行測試。
還沒完,雖然 .NET6 中關(guān)于 Blazor - 桌面應(yīng)用的信息太少,但是我們可以看一下別的框架,例如 LiveSharp(https://www.livesharp.net/)。
System.CommandLine
以往我們要執(zhí)行命令,如在 Linux 上查看進(jìn)程列表和資源消耗,會使用?top -b -n 1,那么使用 C# 代碼表示:
var psi = new ProcessStartInfo("top", "-b -n 1") { RedirectStandardOutput = true }; var proc = Process.Start(psi);當(dāng)然還有別的方法,但是似乎有點曲折,并且難以理解。在前面示例代碼中,把 top 當(dāng)作一個進(jìn)程,然后使用參數(shù)啟動,但是只適合那種一次性的程序。例如 top 相對于 Windows 中的任務(wù)管理器,?-n 1?表示打印一次輸出就結(jié)束,如果直接調(diào)用?top?則是一直動態(tài)變化,不會主動結(jié)束,這時就會導(dǎo)致出現(xiàn)問題。筆者意思是,這種方式不適合交互式的程序或命令行,如果被調(diào)用的程序一直不會結(jié)束,那么可能給代碼帶來問題;像?cat /etc/os-release?、ls -lah?這些命令,都是一次性輸出的,很容易處理,不會帶來問題。
還要另一種情況就是編寫命令行程序。例如筆者就編寫一個 dotnet tool 工具,名稱為 csys,可以幫助查看主機的一些信息,用戶可以輸入命令加上參數(shù),然后判斷要使用的功能:
publicstaticclassCommand{publicconststring Info = "info";}Console.WriteLine("請輸入命令"); //或者 Main(string[] args) 通過 args 獲取string command = "";command = Console.ReadLine();// netinfoif (command == Command.NETINFO)NETINFO();這種方法太笨了,但是沒有更加好的方法可以處理。
為了更加好地跨平臺,.NET6 推出了 System.CommandLine 包,可以更加方便的執(zhí)行命令和打造命令行程序。
這個庫功能比較多,感興趣的讀者可參考:https://github.com/dotnet/command-line-api
通過這個庫,我們可以很容易打造出像 wget、curl 這樣的命令行程序。
例如,我們 編寫了一個 myapp 的命令行程序,用戶可以這樣執(zhí)行程序:
$> myapp [parse] --int-option not-an-int --file-option file.txt要處理這些參數(shù),我們使用?string[]?和?if?,似乎就不太靈活了。System.CommandLine?中有個?Option<T>?可以幫助程序員更加好地處理這些參數(shù):
// Create a root command with some optionsvar rootCommand = new RootCommand{new Option<int>("--int-option",getDefaultValue: () => 42,description: "An option whose argument is parsed as an int"),new Option<bool>("--bool-option","An option whose argument is parsed as a bool"),new Option<FileInfo>("--file-option","An option whose argument is parsed as a FileInfo")};例如?new Option<int>,表示如果識別到有?--int-option?這個參數(shù),那么后面帶的值是數(shù)值類型,例如:
--int-option 123getDefaultValue:() => 42?則設(shè)定一個默認(rèn)值,如果用戶啟動命令時沒有設(shè)置,則使用默認(rèn)值。
如果沒有填寫這個參數(shù),那么這次?Option<T>?將會使用默認(rèn)值,例如:
# 不加任何參數(shù) $> myappC# 處理這些參數(shù)的代碼:
// Note that the parameters of the handler method are matched according to the names of the optionsrootCommand.Handler = CommandHandler.Create<int, bool, FileInfo>((intOption, boolOption, fileOption) =>{Console.WriteLine($"The value for --int-option is: {intOption}");Console.WriteLine($"The value for --bool-option is: {boolOption}");Console.WriteLine($"The value for --file-option is: {fileOption?.FullName ?? "null"}");});輸出結(jié)果:
The value for --int-option is: 42 The value for --bool-option is: False The value for --file-option is: null示例代碼或程序可參考:https://github.com/dotnet/command-line-api/blob/main/docs/Your-first-app-with-System-CommandLine.md
其它更新
其它一些更新主要是文字方面的,筆者將其中一些比較吸睛的信息整理了一下:
Arm64
.NET5 對 Arm64 版本進(jìn)行了大量的性能改進(jìn),.NET6 繼續(xù)提升性能;
計劃支持在 Windows Arm64 機器上運行 WPF;
提供了Apple Silicon(Arm64)芯片(本機和仿真)的支持;
容器(Docker)
優(yōu)化了容器中 .NET 程序的性能;
優(yōu)化了官方鏡像體積(PGO技術(shù));
各種方式提升啟動和吞吐量性能;
更新了基礎(chǔ)鏡像的版本;
System.Numerics
一組新的數(shù)學(xué) API,提高處理數(shù)學(xué)的性能和根據(jù)硬件提升性能;
改善單文件體積
發(fā)布的二進(jìn)制文件打包形式可以提升體積大小;但是之前一直說的 AOT 極端優(yōu)化,還沒有出現(xiàn);
Crossgen2
Roslyn 是 C# 中用于語法分析和編譯 C# 代碼的 API 集,可以將 C# 代碼編譯為 .dll;而 crossgen2 可以編譯成本機代碼而不是 .dll,crossgen2 是 C# 編寫的,并且可以自舉;crossgen2 僅適用于CoreCLR;
ASP.NET Core
ASP.NET Core 的路線圖獨立于 .NET,大家可以參考:https://themesof.net/?,這個網(wǎng)站是 Blazor 編寫的,不知道為什么,網(wǎng)頁內(nèi)容加載不出來,體驗很不友好呀。也可以看這里獲得一些路線計劃:https://github.com/dotnet/aspnetcore/issues/27883
.NET6 主要計劃內(nèi)容:
熱加載
開發(fā)中可以不需要重新編譯,即可對運行中的程序更新 UI 和代碼,寫 Blazor 和 MVC、API 老方便了;
微型 API
文檔是這樣說的:用更少的代碼和儀式簡化構(gòu)建API端點。但是查看了 Issue 后,發(fā)現(xiàn)這個只是學(xué)習(xí)或者編寫簡單的 API 時可以減少沒必要的 .dll,縮小體積;
單文件發(fā)布
構(gòu)建小型,獨立的高性能應(yīng)用程序和服務(wù);
WebAssembly 提前(AoT)編譯
發(fā)布時將 Blazor WebAssembly 應(yīng)用程序中的.NET代碼直接編譯為 WebAssembly,以顯著提高運行時性能;這樣可以減少一些 .dll 文件;
SPA集成
不懂這個是什么,文檔說可與最新的現(xiàn)代前端JavaScript框架無縫協(xié)作;
Blazor hybrid desktop apps
前面已經(jīng)提到過,可以使用 Blazor 跟 MAUI 一起開發(fā) UI 程序;
HTTP/3
支持 HTTP/3;提升支持力度;
下面說一下當(dāng)前 .NET 6 Preview 1 更新的內(nèi)容。
IAsyncDisposable 在 MV C中的支持
現(xiàn)在?IAsyncDisposable?接口,可以在控制器,頁面模型和視圖組件上實現(xiàn)以異步方式處置資源。
DynamicComponent
DynamicComponent?是一個新的內(nèi)置 Blazor 組件,可用于動態(tài)呈現(xiàn)按類型指定的組件。
可以使用字典將參數(shù)傳遞給渲染的組件:
<DynamicComponent Type="@someType" Parameters="@myDictionaryOfParameters" />@code {Type someType = ...IDictionary<string, object> myDictionaryOfParameters = ... }ElementReference
ElementReference 是一個對象,用于傳遞 HTML 元素引用,在 Js 中我們可以使用 document.getElementById('someId') 來定位元素,但是在 Blazor 中許多組件動態(tài)組合,很難確定 ID 都是唯一的或者準(zhǔn)確定位。為了解決這個問題,Blazor通過 @refelement標(biāo)簽 和ElementReferencestruct 來處理。感興趣的讀者可以查看 Passing HTML element references。
現(xiàn)在 ElementReference 為 InputCheckbox,InputDate,InputFile,InputNumber,InputSelect,InputText,和InputTextArea 等輸入組件提供了更加方便的處理方式,例如將 UI 焦點設(shè)置在這些輸入組件上。
可空引用類型注釋
這個是非常好的規(guī)范約束,現(xiàn)在 ASP.NET Core 中的各個部分都加上了這些注釋,可以更加容易地提升項目的編譯安全性。選擇使用可為空的注釋的項目可能會從ASP.NET Core API中看到新的生成時警告。
另外 EFCore 也進(jìn)行了一些更新,沒啥影響,這里就不提了。
總結(jié)
以上是生活随笔為你收集整理的.NET 6 Preview 1 开箱,带你体验新版本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让 gRPC 提供 REST 服务
- 下一篇: C#连接MySQL数据库实例