https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/javascript
.NET 6.0 SDK 和 Runtime 下載地址:html
https://dotnet.microsoft.com/download/dotnet/6.0前端
下面筆者將給你們介紹一下 .NET 6 Preview 1 目前的更新內容和上手嘗試一些好玩的更新。java
本文並不是翻譯文章,純手工打造。android
.NET6 對多平臺(Android、IOS等)界面應用程序作了統一,提供了在多種平臺和社保上一致的體驗,而且能夠在移動應用和 PC桌面程序之間共享更多的代碼。多平臺統一工具包是基於 Xamarin.Forms 的集成和拓展,使得咱們能夠開發 Windows、MacOS、Android 和 IOS 桌面應用。ios
目前 Visual Studio 支持 Windows 和 MacOS,在已經安裝了 .NET6 SDK 的機器上,發佈的桌面程序能夠在 Windows 和 MacOS 上運行,若是要支持 Android 和 IOS ,則須要下載另外兩個包。這是由於 Windows 和 MacOS 能夠經過安裝 .NET6 Runtime 去運行程序,運行的是 .dll 文件(IL中間代碼),而 Android 和 IOS 都是發佈和運行本機代碼。git
# 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 查找下載連接,發現不開代理下載不了,各位請注意。程序員
.NET6 運行時有 android 和 ios 的特殊標記,要支持移動應用,須要指定名稱,如要支持 Android,在 .csproj 文件中:github
<TargetFramework>net6.0-android</TargetFramework>
下面是一個 Xamarin.Forms 應用的 .csproj 模板:web
<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>
固然,要發佈或者調試程序,須要 SDK 或 仿真器,例如安卓須要 Android SDK以及Android SDK Platform 30
,發佈的時候也須要指定:
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
我想,看到這個更新,最開心的是 Ant Design of Blazor 項目的主導做者 James Yeung 吧。
.NET6 中,能夠將 Blazor 拓展混合到 UI 應用程序中,將 Web 和本機 UI 結合在一塊兒,能夠在桌面中嵌入運行。Blazor 混合開發的方式,稱爲 Blazor Hybrid Apps。
.NET Core 3.0 支持 Blazor Server,3.1 支持 Blazor WebAssembly,Blazor WebAssembly 使用 Mono 運行時,不少 .NETer 應該體驗過 Blazor 開發,WebAssembly 目前來看仍是太大了(.NET Core 3.x),還有性能差等問題。後續 .NET 版本對其進行了大量優化。
VS2019 Preview4 中這個模板名稱變成了 Blazor WebAssembly App ,實際上就是 WebAssembly,加上了 App 這個名稱,可是並不表明是 UI 程序,它依然是 web。
迴歸正題,.NET6 更新的博客說這個 Blazor 能夠跟 MAUI一塊兒搞,可是博客並無提到 Demo 和實現細節,可能還在繼續開發中,Preview 1 可能暫時看不了。那 TM 我下載 VS2019 Preview4 後,仍是不能直接建立???耍我呢?怎麼體驗這個 Blazor 開發桌面應用?
不久前有人建立了這個 Issue:https://github.com/Webreaper/Damselfly/issues/108
不過,Blazor 卻是能夠跟移動應用搞一塊兒,有個項目叫 Mobile Blazor Bindings,能夠將 Blazor 結合到 Xamarin 中,這個項目在 .NET Core 3.x 就已經支持了。
項目地址: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 命令來建立這種項目,對應模板以下:
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/Web
mobileblazorbindings 很差玩,你們不要試。
咱們可使用命令來建立模板項目:
dotnet new blazorhybrid
目錄結構: 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 文件,引用這些組件編寫界面以及動態操做。
測試代碼(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 標籤 如<br />
,如今可使用 Razor 語法,可是還不能直接使用 HTML。 猜想多是將 Razor 轉換到 Xaml ,因此只能使用裏面已經定義好的組件。怎麼加入 CSS 也是個問題。這也說明了,不支持那些 js !
而 .NET6 博文中提到的 Blazor desktop apps,看界面樣子,應該是網頁版本嵌入的。可是目前還不能嘗試,因此沒法測試,跳過。
回顧一下跨平臺 UI 應用,主要提到 Xamarin 和 Blazor,而 .NET6 會出現一個新的跨平臺 APP UI 框架,叫 MAUI,.NET MAUI是Xamarin.Forms 的演進,這個在 2020 年時就出現了。這個庫的目的是統一 Xamarin SDK 到 .NET 中,而且可以與其它項目共享代碼(如Blazor)。
目前有兩種方式能夠嘗試 MAUI:
後者已經提到了,MVU 這種讀者有興趣能夠自行測試。
還沒完,雖然 .NET6 中關於 Blazor - 桌面應用的信息太少,可是咱們能夠看一下別的框架,例如 LiveSharp。
以往咱們要執行命令,如在 Linux 上查看進程列表和資源消耗,會使用 top -b -n 1
,那麼使用 C# 代碼表示:
var psi = new ProcessStartInfo("top", "-b -n 1") { RedirectStandardOutput = true }; var proc = Process.Start(psi);
固然還要方式,可是彷佛有點曲折,而且難以理解。在前面示例代碼中,把 top 看成一個進程,而後使用參數啓動,可是隻適合那種一次性的程序。例如 top 相對於 Windows 中的任務管理器, -n 1
表示打印一次輸出就結束,若是直接調用 top
則是一直動態變化,不會主動結束,這時就會致使出現問題。筆者意思是,這種方式不適合交互式的程序或命令行,若是被調用的程序一直不會結束,那麼可能給代碼帶來問題;像 cat /etc/os-release
、ls -lah
這些命令,都是一次性輸出的,很容易處理,不會帶來問題。
還要另外一種狀況就是編寫命令行程序。例如筆者就編寫一個 dotnet tool 工具,名稱爲 csys,能夠幫助查看主機的一些信息,用戶能夠輸入命令加上參數,而後判斷要使用的功能:
public static class Command { public const string Info = "info"; } Console.WriteLine("請輸入命令"); //或者 Main(string[] args) 經過 args 獲取 string command = ""; command = Console.ReadLine(); // netinfo if (command == Command.NETINFO) NETINFO();
這種方法太笨了,可是沒有更加好的方法能夠處理。
爲了更加好地跨平臺,.NET6 推出了 System.CommandLine 包,能夠更加方便的執行命令和打造命令行程序。
這個庫功能比較多,感興趣的讀者可參考:https://github.com/dotnet/command-line-api
經過這個庫,咱們能夠很容易打造出像 wget、curl 這樣的命令行程序。
例如,咱們 編寫了一個 myapp 的命令行程序,用戶能夠這樣執行程序:
$> myapp [parse] --int-option not-an-int --file-option file.txt
要處理這些參數,咱們使用 string[]
和 if
,彷佛就不太靈活了。System.CommandLine
中有個 Option<T>
能夠幫助程序員更加好地處理這些參數:
// Create a root command with some options var 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
這個參數,那麼後面帶的值是數值類型,例如:
--int-option 123
getDefaultValue:() => 42
則設定一個默認值,若是用戶啓動命令時沒有設置,則使用默認值。
若是沒有填寫這個參數,那麼此次 Option<T>
將會使用默認值,例如:
# 不加任何參數 $> myapp
C# 處理這些參數的代碼:
// Note that the parameters of the handler method are matched according to the names of the options rootCommand.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"}"); });
輸出結果:
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 版本進行了大量的性能改進,.NET6 繼續提高性能;
計劃支持在 Windows Arm64 機器上運行 WPF;
提供了Apple Silicon(Arm64)芯片(本機和仿真)的支持;
容器(Docker)
優化了容器中 .NET 程序的性能;
優化了官方鏡像體積(PGO技術);
各類方式提高啓動和吞吐量性能;
更新了基礎鏡像的版本;
System.Numerics
一組新的數學 API,提升處理數學的性能和根據硬件提高性能;
改善單文件體積
發佈的二進制文件打包形式能夠提高體積大小;可是以前一直說的 AOT 極端優化,尚未出現;
Crossgen2
Roslyn 是 C# 中用於語法分析和編譯 C# 代碼的 API 集,能夠將 C# 代碼編譯爲 .dll;而 crossgen2 能夠編譯成本機代碼而不是 .dll,crossgen2 是 C# 編寫的,而且能夠自舉;crossgen2 僅適用於CoreCLR;
ASP.NET Core 的路線圖獨立於 .NET,你們能夠參考:https://themesof.net/ ,這個網站是 Blazor 編寫的,不知道爲何,網頁內容加載不出來,體驗很不友好呀。也能夠看這裏得到一些路線計劃:https://github.com/dotnet/aspnetcore/issues/27883
.NET6 主要計劃內容:
熱加載
開發中能夠不須要從新編譯,便可對運行中的程序更新 UI 和代碼,寫 Blazor 和 MVC、API 老方便了;
微型 API
文檔是這樣說的:用更少的代碼和儀式簡化構建API端點。可是查看了 Issue 後,發現這個只是學習或者編寫簡單的 API 時能夠減小不必的 .dll,縮小體積;
單文件發佈
構建小型,獨立的高性能應用程序和服務;
WebAssembly 提早(AoT)編譯
發佈時將 Blazor WebAssembly 應用程序中的.NET代碼直接編譯爲 WebAssembly,以顯着提升運行時性能;這樣能夠減小一些 .dll 文件;
SPA集成
不懂這個是什麼,文檔說可與最新的現代前端JavaScript框架無縫協做;
Blazor hybrid desktop apps
前面已經提到過,可使用 Blazor 跟 MAUI 一塊兒開發 UI 程序;
HTTP/3
支持 HTTP/3;提高支持力度;
下面說一下當前 .NET 6 Preview 1 更新的內容。
IAsyncDisposable在MVC中的支持
如今 IAsyncDisposable
接口,能夠在控制器,頁面模型和視圖組件上實現以異步方式處置資源。
DynamicComponent
DynamicComponent
是一個新的內置 Blazor 組件,可用於動態呈現按類型指定的組件。
<DynamicComponent Type="@someType" />
可使用字典將參數傳遞給渲染的組件:
<DynamicComponent Type="@someType" Parameters="@myDictionaryOfParameters" /> @code { Type someType = ... IDictionary<string, object> myDictionaryOfParameters = ... }
ElementReference
ElementReference 是一個對象,用於傳遞 HTML 元素引用,在 Js 中咱們可使用 document.getElementById('someId')
來定位元素,可是在 Blazor 中許多組件動態組合,很難肯定 ID 都是惟一的或者準肯定位。爲了解決這個問題,Blazor經過 @ref
element標籤 和ElementReference
struct 來處理。感興趣的讀者能夠查看 Passing HTML element references。
如今 ElementReference 爲 InputCheckbox,
InputDate,
InputFile,
InputNumber,
InputSelect,
InputText,和
InputTextArea 等輸入組件提供了更加方便的處理方式,例如將 UI 焦點設置在這些輸入組件上。
可空引用類型註釋
這個是很是好的規範約束,如今 ASP.NET Core 中的各個部分都加上了這些註釋,能夠更加容易地提高項目的編譯安全性。選擇使用可爲空的註釋的項目可能會從ASP.NET Core API中看到新的生成時警告。
另外 EFCore 也進行了一些更新,沒啥影響,這裏就不提了。