.NET周報【10月第1期 2022-10-11】
本周精選
繼C#實現await/async無棧協程幾年後,davidwrighton實現了.NET綠色執行緒(有棧協程)的原型
//github.com/dotnet/runtimelab/pull/2002
.NET Runtimelab中綠色執行緒的原型實現的PR,在不久的將來,.NET開發者也可以方便的用上有棧協程,目前的啟動一個有棧協程的API如下所示:

FOH(凍結對象堆)正式合併進入.NET 8,將進一步提升整體性能
//twitter.com/EgorBo/status/1579474949152313347?ref_src=twsrc^tfw
談論FOH(凍結對象堆)的許多部分將被合併到.NET 8中,因此像typeof(x)這樣的東西在生成JIT程式碼時可以處理直接引用省略寫屏障,進一步提升性能。對比的彙編程式碼如下所示:

Bing 廣告宣傳平台遷移至.NET6 - .NET Blog
//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
//itnext.io/from-junior-to-genius-an-optimization-story-ab20afc8159d
一篇關於調整程式碼的文章,根據計算32位校驗和的程式碼,在不同的階段進行計算。
文章從一個簡單的實現,到一個不安全的實現,到一個棘手的實現,到一個簡單的實現,到一個使用SIMD的實現,最後到一個85倍的性能優化。
主題
Console.ReadKy在.NET 7中的優化 - .NET Blog
//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
//devblogs.microsoft.com/visualstudio/comparing-files-in-visual-studio/
關於考慮在Visual Studio中實現文件比較功能的問題。
Visual Studio過去沒有提供通過選擇任意文件來比較文件的功能,但它已經開始考慮。 首先,他們已經開始試驗一個名為 "文件差異 "的功能擴展,文章介紹了該擴展的功能。
如果你有興趣,他們希望你能提供回饋和投票。
- File Differ - Visual Studio Marketplace
- [NEW] Is there a way to compare two files from solution explorer? - Visual Studio Feedback
用MSAL.NET對.NET MAUI應用程式進行認證 - .NET Blog
//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
//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
//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
//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
宣布NuGet PackageReference支援Visual Studio 2022 17.3版或更高版本中針對.NET Core或.NET 5或更高版本的C++/CLI MSBuild項目。
文章、幻燈片等
一個將Xamarin.Forms庫移植到MAUI的故事
//speakerdeck.com/muak/xamarin-dot-formsraiburariwo-mauiniyi-zhi-sitahua
談及將Xamarin.Forms的庫移植到.NET MAUI的幻燈片。
在這裡,我們要介紹一下.NET MAUI,包括實施方法的不同和技巧。
MAUI的當前狀態和進化點| ドクセル
//www.docswell.com/s/hiro128_777/KW79X5-2022-09-30-184910
幻燈片顯示了.NET MAUI與Xamarin.Forms的架構差異,對各種工具的支援現狀等。
.NET注釋月刊 | 2022年10月 | The .NET Tools Blog
//blog.jetbrains.com/dotnet/2022/10/06/net-annotated-monthly-october-2022/
2022年10月,JetBrains公司發布了一篇與.NET相關的資訊匯總文章
[C#] .NET使用NamedPipe進行進程間通訊(IPC)(WPF示例) - Qiita
//qiita.com/kobayashi_stmn/items/7de42805eba009deebaa
關於如何在.NET 6 WPF應用程式中使用NamedPipe進行進程間通訊的文章。
Visual Studio的Azure Marketplace鏡像現在支援Microsoft Dev Box - Visual Studio Blog
宣布Azure Marketplace Visual Studio鏡像現在由Microsoft Dev Box支援。
在.NET 6中為強類型的配置對象添加驗證資訊
//andrewlock.net/adding-validation-to-strongly-typed-configuration-objects-in-dotnet-6/
關於如何在.NET 6 Microsoft.Extensions.Configuration中為強類型的配置對象添加驗證的文章。
了解OpenTelemetry .NET (8) 手動追蹤連接示例:通過Azure服務匯流排在應用程式之間連接追蹤
//tech.tanaka733.net/entry/2022/10/opentelemetry-dotnet-08
關於如何使用Azure服務匯流排在服務之間連接請求的痕迹的文章。
使用.NET 7的Blazor自定義元素來渲染動態內容
//jonhilton.net/blazor-custom-elements/
關於如何使用自定義元素在Blazor中構建動態元素的文章。
我們是如何通過刪除閉包分配來實現5倍的管道執行速度的
//particular.net/blog/pipeline-and-closure-allocations
關於通過減少NServiceBus中的lambda捕獲(分配)來提高性能的文章。
即使是.NET MAUI也想打開鍵盤! (Android)
//zenn.dev/test_myname/articles/d982b67cf0615f
關於如何在.NET MAUI中顯示/隱藏Android螢幕鍵盤的文章。
Blazor WASM在GH頁面上的自定義404頁面
//dev.to/dotnet/blazor-wasm-custom-404-page-on-gh-pages-1o99
當Blazor WebAssembly託管在GitHub Pages上時,如何在訪問不存在的頁面時顯示一個自定義錯誤頁面的文章。
圖書館、資料庫、工具等
GitHub - xoofx/Antlr4Ast: Antlr4Ast是一個.NET庫,為ANTLR4/g4文件提供一個解析器和抽象語法樹(AST)。
一個能解析ANTLR4/g4文件以創建AST的庫。
Hey .NET folks, it's a rainy Sunday here so I just released a new .NET library //t.co/3tlFpUlJnt to parse ANTLR4/g4 files into a lightweight AST useful for codegen scenarios.
— Alexandre Mutel (@xoofx) October 9, 2022
I'll use this library for #starklang to generate the data oriented syntax from an ANTLR g4 spec! 🏎️
disruptor-net/Disruptor-net: 使用.NET實現 LMAX Disruptor
//github.com/disruptor-net/Disruptor-net
高性能的執行緒到執行緒的消息傳遞框架庫。
bchavez/Bogus: 一個用於C#、F#和VB.NET的簡單的假數據生成器。基於著名的faker.js,並從其移植。
從faker.js移植過來的偽數據生成庫。
網站、文件
Performance-testing with the industrial-grade #BenchmarkDotNet in LINQPad is now as simple as selecting your code and pressing Ctrl+Shift+B. Full integration, with customizable real-time output! //t.co/5mvykpZBX2 pic.twitter.com/PaleWcQBUd
— LINQPad·Joe Albahari (@linqpad) October 3, 2022
LinqPad正在引入一個整合功能,在LINQPad上按下Ctrl+Shift+B可以在BenchmarkDotNet上獲得一個即時的基準測試。
版權
原文版權:mayuki
原文鏈接://github.com/mayuki/WeekRef.NET/blob/master/input/2022/2022-10-11.md
翻譯版權:InCerry
翻譯鏈接://github.com/InCerryGit/WeekRef.NET/blob/master/input_zh-CN/2022/2022-10-11.md

