.NET週報【10月第1期 2022-10-11】

2022-10-17 12:01:15

本週精選

繼C#實現await/async無棧協程幾年後,davidwrighton實現了.NET綠色執行緒(有棧協程)的原型

https://github.com/dotnet/runtimelab/pull/2002

.NET Runtimelab中綠色執行緒的原型實現的PR,在不久的將來,.NET開發者也可以方便的用上有棧協程,目前的啟動一個有棧協程的API如下所示:

FOH(凍結物件堆)正式合併進入.NET 8,將進一步提升整體效能

https://twitter.com/EgorBo/status/1579474949152313347?ref_src=twsrc^tfw

談論FOH(凍結物件堆)的許多部分將被合併到.NET 8中,因此像typeof(x)這樣的東西在生成JIT程式碼時可以處理直接參照省略寫屏障,進一步提升效能。對比的組合程式碼如下所示:

Bing 廣告宣傳平臺遷移至.NET6 - .NET Blog

https://devblogs.microsoft.com/dotnet/bing-ads-campaign-platform-journey-to-dotnet-6/

一個關於Bing的搜尋廣告活動平臺向.NET 6遷移的案例研究(+AKS)。

該平臺建立在幾十個分散式服務上,每秒處理數千個請求,時間不到100ms。 通過WCF託管在一個(僅僅是 "解除 "的)Windows虛擬機器器中的.NET框架4.6和SOAP服務。 在Windows虛擬機器器中託管了一個WCF的SOAP服務和一個.NET框架4.6。

文章介紹了轉移到新的.NET平臺的原因。

原因主要有以下五點:

  • 跨平臺,如使用容器。
  • .NET Core開發在高效能、語言特性和.NET Framwork停止更新
  • 由於快速迭代改進,減少了創新摩擦
  • 開放原始碼。
  • 卓越的工具,如CLI工具、SDK風格的專案和消除繫結重定向等

遷移過程中,庫的順序是".NET Framwork 4.6→. Framwork .7→.NET Standard 2.0",而應用的順序是".NET Framwork 4.6→.NET Framwork 4.7→.NET Core 3.1→.NET 5→.NET 6",按順序排列。 .NET Framwork 4.6並不完全支援.NET Standard,遷移到.NET Standard並不容易。

該專案在遷移過程中提出了幾個挑戰和解決方案。

首先,該專案依賴於一些NuGet軟體包,這意味著必須更新軟體包和替換舊庫。 不相容的軟體包被重新包裝,並以支援.NET標準的形式釋出到內部軟體包中,甚至沒有原始碼的軟體包也被反編譯和修補,使其與.NET標準相容。

通過轉移到PackageReference方法,解決了繫結重定向的問題,這也解決了菱形依賴性問題。 由於有大量的.csproj,遷移是通過SDK式的轉換工具實現的。 隨後,.NET團隊釋出了一個名為try-convert的類似工具。 他們還試圖集中管理軟體包的版本,以減少軟體包依賴關係的複雜性。 (文章中的連結。Microsoft.Build.CentralPackageVersions是一個新的NuGet的 中央軟體包管理,它似乎是[NuGet的]的前身。

最後,還有對WCF的依賴。 該服務是由WCF用SOAP服務構建的,由於它是對使用者開放的,所以不可能遷移到類似gRPC的東西上,所以最後建立了CoreWCF,它是WCF的一個子集,並進行了遷移。 談到.NET框架與.NET的關係時,他說:"我們的目標是使我們的產品和服務更有競爭力。

從WCF到CoreWCF的遷移對.NET有很大的影響,可以減少40-50%的記憶體使用。

總而言之,向.NET 6的遷移是一次大規模的、痛苦的但值得的經歷,從大型程式碼庫的遷移中總結出以下經驗:

  • 遷移到.NET框架4.7或.NET框架4.8
  • 將所有專案轉換為SDK風格,並在開始工作前使用PackageReference。
  • 在.NET框架和.NET專案之間可以共用程式碼。
  • 使用集中的軟體包管理,以方便遷移到新的NuGet軟體包上

從少年到天才:一個優化的故事 | by Israel Lot | Oct, 2022 | ITNEXT

https://itnext.io/from-junior-to-genius-an-optimization-story-ab20afc8159d

一篇關於調整程式碼的文章,根據計算32位元校驗和的程式碼,在不同的階段進行計算。

文章從一個簡單的實現,到一個不安全的實現,到一個棘手的實現,到一個簡單的實現,到一個使用SIMD的實現,最後到一個85倍的效能優化。

主題

Console.ReadKy在.NET 7中的優化 - .NET Blog

https://devblogs.microsoft.com/dotnet/console-readkey-improvements-in-net-7/

文章描述了.NET 7中的重寫和修改,使Console.ReadKey在Unix/Linux上表現得更好。

一段時間以來,在Unix/Linux上的Console.ReadKey的行為,在輸入的組合鍵和處理修改鍵方面,已經發現了一些BUG。 為了解決這個問題,在.NET 7中的程式碼已經被重新編寫了。

文章介紹了在重寫前為增加自動測試覆蓋率所採取的方法,內部系統呼叫的呼叫,舊的實現和新的實現。

它還引入了runtimeconfig.json和環境變數設定,恢復到.NET 6相容行為。 這些相容性行為將在.NET 8中被刪除。

在Visual Studio中對檔案進行比較 - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/comparing-files-in-visual-studio/

關於考慮在Visual Studio中實現檔案比較功能的問題。

Visual Studio過去沒有提供通過選擇任意檔案來比較檔案的功能,但它已經開始考慮。 首先,他們已經開始試驗一個名為 "檔案差異 "的功能擴充套件,文章介紹了該擴充套件的功能。

如果你有興趣,他們希望你能提供反饋和投票。

用MSAL.NET對.NET MAUI應用程式進行認證 - .NET Blog

https://devblogs.microsoft.com/dotnet/authentication-in-dotnet-maui-apps-msal/

宣佈在Microsoft Identity.Client 4.47.0(MSAL.NET)中支援.NET MAUI。

A宣佈.NET MAUI社群工具包 v1.3 - .NET Blog

https://devblogs.microsoft.com/dotnet/announcing-the-dotnet-maui-community-toolkit-v13/

.NET MAUI Community Toolkit v1.3已經發布。

.NET MAUI Community Toolkit v1.3現已釋出,包括狀態列樣式、Gravatar圖片來源、動畫增強和源連結支援等內容。

釋出11.0.0版預覽2 · AvaloniaUI/Avalonia

https://github.com/AvaloniaUI/Avalonia/releases/tag/11.0.0-preview2

Avalonia 11.0.0 Preview 2已經發布。

它包括幾個穩定性改進和各種修復。

Rider 2022.3 EAP 2: 新的使用者介面,改進的單元測試,更好的動態程式分析和更多的內容. | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/10/07/rider-2022-3-eap-2/

Rider 2022.3 EAP 2已經發布。

新的基於IntelliJ的IDE UI,改進了Search Everywhere、工具視窗和Solution Explorer,Linux和macOS支援Rider的內建dotMemory,支援C# 11,改進了單元測試探索器,改進了 支援.NET MAUI,支援在IIS中啟動,動態程式分析(資料庫存取),等等。

宣佈NuGet PackageReference支援針對.NET Core和.NET 5或更高版本的C++/CLI MSBuild專案 - C++ Team Blog

https://devblogs.microsoft.com/cppblog/announcing-nuget-packagereference-support-for-c-cli-msbuild-projects-targeting-net-core/

宣佈NuGet PackageReference支援Visual Studio 2022 17.3版或更高版本中針對.NET Core或.NET 5或更高版本的C++/CLI MSBuild專案。

文章、幻燈片等

一個將Xamarin.Forms庫移植到MAUI的故事

https://speakerdeck.com/muak/xamarin-dot-formsraiburariwo-mauiniyi-zhi-sitahua

談及將Xamarin.Forms的庫移植到.NET MAUI的幻燈片。

在這裡,我們要介紹一下.NET MAUI,包括實施方法的不同和技巧。

MAUI的當前狀態和進化點| ドクセル

https://www.docswell.com/s/hiro128_777/KW79X5-2022-09-30-184910

幻燈片顯示了.NET MAUI與Xamarin.Forms的架構差異,對各種工具的支援現狀等。

.NET註釋月刊 | 2022年10月 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/10/06/net-annotated-monthly-october-2022/

2022年10月,JetBrains公司釋出了一篇與.NET相關的資訊彙總文章

[C#] .NET使用NamedPipe進行程序間通訊(IPC)(WPF範例) - Qiita

https://qiita.com/kobayashi_stmn/items/7de42805eba009deebaa

關於如何在.NET 6 WPF應用程式中使用NamedPipe進行程序間通訊的文章。

Visual Studio的Azure Marketplace映象現在支援Microsoft Dev Box - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/visual-studios-azure-marketplace-images-now-support-microsoft-dev-box/

宣佈Azure Marketplace Visual Studio映象現在由Microsoft Dev Box支援。

在.NET 6中為強型別的設定物件新增驗證資訊

https://andrewlock.net/adding-validation-to-strongly-typed-configuration-objects-in-dotnet-6/

關於如何在.NET 6 Microsoft.Extensions.Configuration中為強型別的設定物件新增驗證的文章。

瞭解OpenTelemetry .NET (8) 手動追蹤連線範例:通過Azure服務匯流排在應用程式之間連線追蹤

https://tech.tanaka733.net/entry/2022/10/opentelemetry-dotnet-08

關於如何使用Azure服務匯流排在服務之間連線請求的痕跡的文章。

使用.NET 7的Blazor自定義元素來渲染動態內容

https://jonhilton.net/blazor-custom-elements/

關於如何使用自定義元素在Blazor中構建動態元素的文章。

我們是如何通過刪除閉包分配來實現5倍的管道執行速度的

https://particular.net/blog/pipeline-and-closure-allocations

關於通過減少NServiceBus中的lambda捕獲(分配)來提高效能的文章。

即使是.NET MAUI也想開啟鍵盤! (安卓)

https://zenn.dev/test_myname/articles/d982b67cf0615f

關於如何在.NET MAUI中顯示/隱藏Android螢幕鍵盤的文章。

Blazor WASM在GH頁面上的自定義404頁面

https://dev.to/dotnet/blazor-wasm-custom-404-page-on-gh-pages-1o99

當Blazor WebAssembly託管在GitHub Pages上時,如何在存取不存在的頁面時顯示一個自定義錯誤頁面的文章。

圖書館、資料庫、工具等

GitHub - xoofx/Antlr4Ast: Antlr4Ast是一個.NET庫,為ANTLR4/g4檔案提供一個解析器和抽象語法樹(AST)。

https://github.com/xoofx/Antlr4Ast

一個能解析ANTLR4/g4檔案以建立AST的庫。