1. 程式人生 > >.NET5釋出,這個微軟“全家桶”會是.NET的春天嗎?

.NET5釋出,這個微軟“全家桶”會是.NET的春天嗎?

在全面開源的步伐下,微軟也逐步跟上了腳步,作為微軟最早邁向開源的重要軟體之一,.NET 5的釋出對微軟及其使用者都具有重要意義。

微軟未來目標是將所有的 .NET 元件整合到一個產品下,然後使用者可以根據需求使用 .NET 的某個部分,而不是單獨下載或安裝所有內容。

對於Visual Studio使用者,需要Visual Studio 16.8或更高的版本才能在Windows上使用.NET 5.0,在MacOS上使用最新版本的Visual Studio for Mac)。Visual Studio Code的C#擴充套件也已經支援.NET5.0和C#9。

NET 5.0是.NET統一之旅的第一個版本。微軟希望 .NET Framework 開發者能夠遷移他們的程式碼和應用到 .NET 5.0 上,為明年釋出的 .NET 6.0 將 Xamarin 開發者過渡到統一平臺奠定基礎。

版本釋出時間軸:

.NET Core 3.0 已於2019/09推出

.NET Core 3.1 已於 2019/12推出,為 LTS (Long Term Support,長期支援版),之後.NET Core 將更名.NET,固定每年釋出新版,並定義雙數版號為LTS版,單數版號為Current版。

.NET 5.0 2020/11

.NET 6.0 LTS 2021/11

.NET 7.0 2022/11

.NET 8.0 LTS 2023/11

如有興趣,可以體驗一下,歷來釋出資料及地址:https://dotnet.microsoft.com/download/dotnet/5.0

.NET 5.0是.NET Framework和.NET Core核心的結合,旨在統一.NET平臺。.NET 5.0毫無疑問代表的是.NET的未來,但是目前國內大部分企業使用的依然是.NET Framework,不過長期來看,升級似乎不可避免。

為了充分論證.NET5的效能,自首個預覽版釋出以來微軟已經進行了廣泛的內部部署,除了在 .NET 5.0 上執行.NET網站外,Bing也在使用這個新平臺。

並在此次更新中強調了一些比較顯著的變化,包括一些效能上的改進。

以下是微軟釋出的此版本的相關亮點:

1..NET 5.0 已經部署到 http://dot.net和 http://Bing.com 託管數月,已經得到了實戰檢驗。

2.很多元件的效能都得到了極大的提高。.NET 5.0 中 ARM64 的效能 和 GRPC 等都有改善

3.C# 9和F# 5提供了新的語言改進,如C# 9的頂層程式和記錄,而F# 5則提供了互動式程式設計和.NET上功能程式設計的效能提升。

4..NET庫對Json序列化、正則表示式和HTTP(HTTP 1.1、HTTP/2)的效能有所提升。它們現在也被完全註釋為可空性。

5.由於GC、分層編譯等方面的完善,P95延遲有所下降。

6.應用部署選項更好了,有了ClickOnce客戶端應用釋出、單檔案應用、容器映象尺寸減小,並增加了Server Core容器映象。

7.平臺範圍擴大,增加了WindowsArm64和WebAssembly。

8.一個值得注意的變化是,.NET 5.0應用可以原生執行在ARM64 Windows裝置上,消除了模擬帶來的一些效能障礙。然而,在這個版本中,Windows 桌面元件並不能用於ARM64裝置--這計劃在.NET 5.0的服務更新中進行。

近幾年.NET Core 的開源專案也非常活躍,隨著.net5的釋出,這些專案將會逐步整合到.net5及之後的版本中。

但是有幾點需要特別注意:

目前的.NET5雖然已經足夠強,但嚴格來說依然屬於實現階段,.NET6.0或許更值得期待。

目前關於.net5的挺多升級並未在實際中討論,例如正則效能提升,靜態正則快取;Kestrel 的通訊效能提升,支援Http3; 證書互轉,增強 SSL 通訊;readonly struct 在內部的應用;HttpClient 人性化的 Api,支援 webassembly, 支援序列化結果,支援 Quic 等;Json 支援欄位序列化,只讀型別序列化,Web型別序列化,迴圈引用序列化等特性;GC 可分配 no zero 的記憶體空間,分配“固定住”的大堆空間,GCMemoryInfo 等等。

如果並沒有急切的需求,目前並不建議升級至5.0,可以將5.0作為研究跳板,在明年微軟釋出6.0LTS長期維護版本的時候再考慮升級,降低風險。當然,這個需要根據實際情況進行評估。

......

接下來,放一個.NET Core3.1升級.NET5可能遇到的坑,以作參考,不需要的可以略過此部分,作者“dotnet跨平臺”。

此前Scott Hunter在部落格信誓旦旦.NET Core3.1平滑遷移.NET5,於是當天就去升級我的寶藏專案,結果是大坑沒有,小坑不斷,折騰了一天時間才搞定,下面來仔細捋一捋,給搭建提供點參考。

背景介紹

升級的專案是之前開源在Github上,也曾一週新增300star,後面雖因故關閉了,但我個人是非常用心的。這不.NET5剛釋出,第一時間就開始了升級。

專案是個微信小程式商城,後端是微服務架構支撐的,Ocelot閘道器+Consul服務註冊發現+Core WebApi+gRPC+IdentityServer4都安排上了,整體還是比較複雜的,MongoDB、Redis、RabbitMQ也都安排上了,然後就在.NET Core3.1升級.NET5的過程中,各種踩坑。

VS升級坑

升級的第一個坑來自於VS工具升級!之前.NET5預覽版、RC1、RC2都是用的Visual Studio 2019 Preview,這會兒.NET5正式版發現只需要把Visual Studio 2019升級到V16.8即可,然後就興沖沖的升級去了,結果當頭一棒:Visual Studio Installer提示網路未連線無法下載!當然不是我的網路問題,其實是DNS解析上出了毛病(部分使用者會遇到,解決辦法是把電腦的DNS設定為8.8.8.8即可),但畢竟當時是11號凌晨,以為是微軟官方同步不夠,我就選擇換工具,直接去Linux下用VS Code升級了,然後就開始了第二波環境坑!

經驗:如果遇到Visual Studio Installer提示網路未連線無法下載,可以將當前電腦DNS設定為8.8.8.8即可

Linux環境坑

Linux環境下VS Code開發之前都蠻熟悉了,這次想著是升級.NET5,就順手把Linux系統從CentOS7給換成了CentOS8,然後又華麗麗的各種坑。比如CentOS8中網絡卡名字從ens33變成了eth0,用nftables替代iptables,各種小變化讓人防不勝防,然後docker最新版本的命令也跟之前有些小變化,導致之前整理的Linux+Docker操作筆記各種失靈,來來回回折騰了好幾個小時。

當然,環境只是環境,折騰完就過去了,而程式碼遷移層面的坑才是最麻煩的,因為並不知道還有多少沒發現!

.NET5遷移坑坑坑

專案從.NET Core3.1升級到.NET5非常easy,在 global.json 中將SDK版本從3.1升級成5.0,再將TargetFramework從netcoreapp3.1換成net5.0即可。還有部分類庫名稱空間變化完全沒關係,宇宙第一IDE的智慧提示輕鬆解決。但是,在真實專案遷移過程中,我卻遇到了各種小問題:

1.Core WebApi框架模板專案中預設集成了swagger,這個是新增的,但之前專案有一些自定義配置和擴充套件,也導致了衝突。

2.IdentityServer4第三方框架版本升級,API變化很有點多,改動不了不少程式碼,這個鍋雖然不是.NET5的,但也是升級專案會遇到的。

3.嘗試C#9花了一些時間,想體驗下新語法新特性,如Native ints原生Ints、Pattern matching improvements模式匹配改進版,結果幾次把自己繞進去了。

4.專案升級完發現的Bug,DateTime這個天天見的值出現了變化,在 ASP.NET Core 3.1 及更早版本中,DateTime繫結的是伺服器本地時間,而5.0之後,DateTime繫結的是UTCTime。

LR