.NET週報【11月第4期 2022-11-30】

2022-12-01 12:00:58

國內文章

.NET 7 的 AOT 到底能不能扛反編譯?

https://www.cnblogs.com/huangxincheng/p/16917197.html

在B站,公眾號上發了一篇 AOT 的文章後,沒想到反響還是挺大的,都稱讚這個東西能抗反編譯,可以讓破解難度極大提高,可能有很多朋友對逆向不瞭解,以為用 ILSpy,Reflector,DnSpy 這些工具打不開就覺得很安全,其實不然,在 OllyDbg,IDA,WinDBG 這些逆向工具面前一樣是裸奔。

關於 .NET 在不同作業系統中 IO 檔案路徑拼接方法,升級 .NET 7 後注意到的一個知識點

https://www.cnblogs.com/berkerdong/p/16920239.html

.NET 現在支援跨平臺這件事情已經是眾所周知的特點了,雖然平臺整體支援跨平臺了,但是我們的程式碼如果真的想要實現跨平臺執行其實還是有些小細節要注意的,今天想要記錄分享的就是關於 檔案I/O操作時路徑的拼接問題。

.NET效能優化-使用記憶體+磁碟混合快取

https://www.cnblogs.com/InCerry/p/dotnet-opt-per-use-hybrid-cache.html

經過一段時間的研究,筆者實現了一個基於微軟FasterKv封裝的程序內混合快取庫(記憶體+磁碟),它有著更加易用的API,接下來就和大家討論討論它。

你認識的C# foreach語法糖,真的是全部嗎?

https://www.cnblogs.com/JulianHuang/p/16907679.html

本文的知識點其實由golang知名的for迴圈陷阱發散而來,對應到我的主力語言C#, 其實牽涉到閉包、foreach。為了便於理解,我重新組織了語言,以倒敘結構行文。

從 .NET 6 更新到 .NET 7

https://mp.weixin.qq.com/s/94PKmYtcuKslTldrxXKiTg

.NET 7 已經發布了一段時間了,將幾個服務升級到了 .NET 7,升級還是比較順利的,也有遇到幾個問題,分享一下。

MASA Framework 事件匯流排 - 跨程序事件匯流排

https://mp.weixin.qq.com/s/ZWlJN52WiXcWwxQ3lOQuBg

跨程序事件匯流排允許釋出和訂閱跨服務傳輸的訊息, 服務的釋出與訂閱不在同一個程序中,在MASA Framework中, 跨程序匯流排事件提供了一個可以被開箱即用的程式。

Silky 微服務架構

https://github.com/liuhll/silky

在.NET平臺下的微服務應用開發框架,支援微服務場景的諸多特性,如服務治理、RPC通訊、鏈路跟蹤、分散式事務等。

聊一聊如何截獲 C# 程式產生的紀錄檔

https://mp.weixin.qq.com/s/5VtFnzuA8sKMNsBS9HhgEQ

前段時間分析了一個dump,一頓操作之後,我希望用外力來阻止程式內部對某一個com元件的呼叫,對,就是想借助外力實現,如果用 windbg 的話,可以說非常輕鬆,但現實情況比較複雜,客戶機沒有windbg,也不想加入任何的手工設定,希望全自動化來處理,看看我是如何實現的。

kotlin的suspend對比csharp的async&await

https://mp.weixin.qq.com/s/DQMpsA9HyF4VfbiEl_M5tQ

協程的出現大大降低了非同步程式設計的複雜度,可以讓我們像寫同步程式碼一樣去寫非同步程式碼,如果沒有它,那麼很多非同步的程式碼都是需要靠回撥函數來一層層巢狀,這個在我之前的一篇有介紹 rxjava回撥地獄-kotlin協程來幫忙,本篇文章主要介紹:

  • kotlin的suspend函數在編譯生成了怎樣的程式碼
  • csharp的async&await在編譯生成了怎麼樣的程式碼
  • 這兩者相比較,引發怎樣的思考

用最少的程式碼模擬gRPC四種訊息交換模式

https://mp.weixin.qq.com/s/df_GvlGWiPIRVrd1OmHfwA

我們知道,建立在HTTP2/3之上的gRPC具有四種基本的通訊模式或者訊息交換模式(MEP: Message Exchange Pattern),即Unary、Server Stream、Client Stream和Bidirectional Stream。本篇文章通過4個簡單的範例演示它們在.NET平臺上的實現原理,原始碼從這裡檢視。

C# 逆變的具體應用場景

https://mp.weixin.qq.com/s/6yVqPhj0V9P7g4XtwREpZg

早期在學習泛型的協變與逆變時,網上的文章講解、例子算是能看懂,但關於逆變的具體應用場景這方面的知識,我並沒有深刻的認識。

話題

.NET7 GRPC效能表現亮眼

https://github.com/LesnyRumcajs/grpc_bench/discussions/310

2022年11月27日gcnyin大佬提交了grpc_bench的框架升級的PR(將各個語言的的版本都升級了),在預覽測試結果中dotnet_grpc以14w/s的成績取得了第一名。

AppHarbor正在關閉 - AppHarbor

https://blog.appharbor.com/2022/11/09/shutting-down-appharbor

.NET應用程式託管服務AppHabor宣佈,它將於12月5日關閉。 (11月9日)。

在該日期之後,所有的資料,包括網站、應用程式和資料庫,都將不再能夠被存取。

給嬰兒看的C#

https://lp.jetbrains.com/csharp-for-babies/

JetBrains的一本電子書,幫助嬰兒瞭解C#。

一本有插圖的圖畫書,對A到Z的單詞進行簡單的解釋。

JamesNK/Newtonsoft.Json 13.0.2版釋出

https://github.com/JamesNK/Newtonsoft.Json/releases/tag/13.0.2

Newtonsoft.Json(JSON.NET)13.0.2已經發布。

這個版本有幾個新功能和錯誤修正,包括支援DateOnly和TimeOnly,以及增加了UnixDateTimeConverter.AllowPreEpoch。

釋出ComputeSharp 2.0 - 通過DirectX 12和D2D1在GPU上輕鬆執行C#!

https://sergiopedri.medium.com/announcing-computesharp-2-0-run-c-on-the-gpu-with-ease-through-directx-12-and-d2d1-be4f3f2312b4

ComputeSharp 2.0已經發布。

2.0已經進行了大量的重寫,其特點是改變了原始碼生成器而不是執行時程式碼生成器,許多新的API,支援D2D1畫素著色器,並引入了XAML控制元件,以便與UWP和WinUI 3.1整合。

這篇文章介紹了ComputeSharp,它是如何工作的,以及它的部分內容,如XAML支援和D2D1畫素著色器。

.NET MAUI現在可以在Visual Studio for Mac 17.4中使用 - Visual Studio部落格

https://devblogs.microsoft.com/visualstudio/net-maui-is-now-available-in-visual-studio-for-mac-17-4/

Visual Studio for Mac 17.4中的.NET MAUI支援已經發布。

類似於Windows上的Visual Studio的.NET MAUI開發,現在可以使用。
對XCode 14.1的支援將很快釋出,C#熱過載和XAML實時預覽等功能將在未來實現。

Rider 2022.3 EAP 9

https://www.jetbrains.com/rider/nextversion/

https://twitter.com/jetbrainsrider/status/1596198425745391621?s=12

Rider 2022.3 EAP 9(早期存取預覽)已經發布。

支援.NET 7 SDK(包括更新的專案模板、中央包管理和C# 11),支援虛幻引擎5.1,後端遷移到.NET 7的效能改進,預設情況下的UI新的工具條 ,以及C#中的機器學習程式碼完成。

ReSharper 2022.3 EAP 9

https://www.jetbrains.com/resharper/nextversion/

https://twitter.com/resharper/status/1596198977795657729?s=12

ReSharper 2022.3 EAP 9(早期存取預覽)已經發布。

該版本擴充套件了EAP 8對ARM64的支援,dotCover、dotTrace、dotMemory和ReSharper命令列工具現在支援ARM64。 其他錯誤也得到了修復,在為正式釋出做準備。

文章、幻燈片

.NET序列化綜述2022

https://aloiskraus.wordpress.com/2022/11/23/net-serialization-roundup-2022/

文章比較了.NET中各種序列化器(二進位制和JSON)的序列化、反序列化和啟動的效能。

利用Web Live Preview和Telerik提高你的生產力 - Visual Studio部落格

https://devblogs.microsoft.com/visualstudio/improve-your-productivity-with-web-live-preview-and-telerik/

一篇關於Web Live Preview的介紹性文章,它在Visual Studio 2022中提供了ASP.NET Web表單的執行時預覽。

這篇文章展示瞭如何啟用和使用Web Live Preview,以及它如何與第三方元件(如Telerik元件)整合。

C# 列表模式匹配的例子 | haacked.com

https://haacked.com/archive/2022/11/22/csharp-list-pattern/

一篇展示C#11列表模式的程式碼範例的文章。

.NET 7刪除了不安全的XmlSecureResolver

https://www.infoq.com/news/2022/11/XmlSecureResolver/

關於XmlSecureResolver在.NET 7中被刪除的文章。

XmlSecureResolver被推薦用來避免參照外部資源引起的XXE,但它是基於程式碼存取安全(CAS)實現的,但由於.NET Core沒有CAS,不再受限制,所以在.NET 7中被刪除。 在.NET 7中,它被廢棄了。 雖然該型別仍然存在,但在構建時列印了一個警告,在執行時參照該型別時引發了一個異常。

建議限制外部資源的行動是使用XmlResolver.ThrowingResolver而不是XmlSecureResolver。

在ASP.NET Core Razor Pages中實現IAsyncPageFilter - Qiita

https://qiita.com/gushwell/items/bcf39aaf708b9a483cf5

關於如何在ASP.NET Core Razor Pages中實現頁面過濾的文章。

我想用Azure AD登入並呼叫Blazor WASM -> ASP.NET Core WebAPI -> MS Graph API

https://zenn.dev/okazuki/articles/auth-blazorwasm-aspnetcore-obo

文章介紹瞭如何從登入Azure AD的Blazor WebAssembly應用程式中用ASP.NET Core Web API呼叫微軟圖形API。

如何使用和構建一個流程(On-Behalf-Of flow),其中伺服器應用程式呼叫Graph API而不是直接從使用者端呼叫。

在OptionsBuilder中使用範圍服務的危險和問題

https://andrewlock.net/the-dangers-and-gotchas-of-using-scoped-services-when-configuring-options-with-options-builder/

關於在使用OptionsBuilder構建設定時使用範圍服務的危險和陷阱的文章。

.NET 7為Kubernetes增加了積極的垃圾收集功能

https://www.infoq.com/news/2022/11/GCCollectionMode-Aggressive/

關於.NET 7中引入的GCCollectionMode.Aggressive的文章。

"Aggressive "是一種模式,在用 "GC.Collect "執行GC時,儘可能多地釋放記憶體。 這對於諸如容器上的工作者有很長的空閒時間,並且在等待時使用很少的記憶體的情況很有用,在這種情況下,你不想完全關閉,但想在等待時保持低的資源使用率。

  • [API建議]:讓應用程式的作者告訴我們要空閒。

用GitHub動作構建和釋出Visual Studio擴充套件程式

https://blog.elmah.io/build-and-publish-visual-studio-extensions-with-github-actions/

關於如何使用GitHub Actions構建和釋出Visual Studio擴充套件(生成VSIX包)的文章。

在Android上執行ASP.NET Core - Qiita

https://qiita.com/karuakun/items/c8439d0aadb2e798cf08

關於在Android上使用Termux、執行Ubuntu、安裝.NET SDK和執行ASP.NET Core應用程式的文章。

.NET中的靜態安全程式碼檢查(Semgrep版)

https://zenn.dev/masakura/articles/b84642b5bd680f

關於如何使用開源靜態安全程式碼檢查工具Semgrep來檢查C#程式碼的文章。

如何用MagicOnion傳送和接收大型複雜資料物件 - Qiita

https://qiita.com/mxProject/items/838ef3e5e2856c66a29c

關於如何使用MagicOnion的串流媒體傳送和接收大型資料物件的文章。

令人困惑的.NET反編譯器:CallVirt OpCode

https://washi.dev/blog/posts/confusing-decompilers-with-callvirt/

關於不同的型別如果在虛擬函數表中具有相同的索引,就可以在IL的CallVirt中呼叫,而反編譯器不能很好地處理的文章。

Lambda冷啟動 - .NET 7 Native AOT vs .NET 6 Managed Runtime | 沒有教條的部落格

https://nodogmablog.bryanhogan.net/2022/11/lambda-cold-starts-net-7-native-aot-vs-net-6-managed-runtime/

文章比較了AWS Lambda中.NET 7 Native AOT和.NET 6執行時的冷啟動時間。

解析 "nettrace "事件流(不僅僅是)。

https://chnasarre.medium.com/parsing-the-nettrace-stream-of-not-only-events-8b95c7f82ec4

關於.NET診斷協定的 "nettrace "流格式以及如何解析它的文章。

dotNETConf/2022/MainEvent/echnical at main - dotnet-presentations/dotNETConf - GitHub

https://github.com/dotnet-presentations/dotNETConf/tree/main/2022/MainEvent/Technical

.NET會議2022年的幻燈片集。

從桌面瀏覽器或播放器中攔截聲音資料,並以類似Spearna的方式顯示出來 - Qiita

https://qiita.com/osamus/items/5093cefe20e8f817bbef

一篇文章總結了使用一個名為BASS的音訊處理庫實現類似Spearna的視覺化器的關鍵點。

[C#]我想嘗試使用MemoryPack 7 - 一些樣例

https://spacekey.dev/memorypack-7

關於實現一個應用程式的文章,該程式使用MemoryPack在ASP.NET Core API伺服器和使用Nuxt的Web前端之間進行通訊處理。

在.NET 8新的使用FOH的集合類

https://steven-giesel.com/blogPost/34e0fd95-0b3f-40f2-ba2a-36d1d4eb5601

關於將在.NET 8中引入的FOH的集合類的文章。

它介紹了FOH的集合類與現有的IReadOnlyList<T>和Immutable集合之間的區別,效能等。

從你的Visual Studio安裝中刪除不支援的元件 - Visual Studio部落格

https://devblogs.microsoft.com/visualstudio/removing-out-of-support-components-from-your-visual-studio-installations/

描述從Visual Studio 2022 17.4安裝中移除不支援的元件的能力的文章。

新的安裝程式允許你一次性刪除Visual Studio安裝中不支援的元件,文章解釋瞭如何做到這一點。

如果安裝程式較新,這個刪除功能可以對Visual Studio 2022的所有版本進行,甚至Visual Studio 2019和2017環境也可以通過安裝2022安裝程式來支援。

開源庫、資源庫、工具

MichalStrehovsky/PublishAotCompressed

https://github.com/MichalStrehovsky/PublishAotCompressed

https://twitter.com/MStrehovsky/status/1595941448326602752

MSBuild的一個擴充套件包,在用Native AOT釋出時,用UPX壓縮可執行檔案。

dhq-boiler/boilersE2E: 支援你的E2E測試

https://github.com/dhq-boiler/boilersE2E

一個用於Windows桌面應用程式的E2E測試的輔助程式庫,包括Windows應用程式驅動程式的啟動和關閉,帶有超時的元素搜尋等。

kalk

https://kalk.dev/

一個為開發者提供的命令列計算器,可以進行各種計算、轉換和硬體內聯的計算。

ForNeVeR/AvaloniaRider: JetBrains Rider外掛用於Avalonia開發

https://github.com/ForNeVeR/AvaloniaRider/

https://twitter.com/fvnever/status/1596592659581345793?s=12

用Rider支援Avalonia開發的外掛。 提供了預覽和模板。

lowleveldesign/windbg-ext-template: 一個用於建立管理的WinDbg擴充套件的模板

https://github.com/lowleveldesign/windbg-ext-template

https://twitter.com/lowleveldesign/status/1596164757353922560?s=12

用WinDbg託管.NET在受控程式碼中實現擴充套件函數的模板。

網站、檔案等

Home | endoflife.date

https://endoflife.date/

一個組合各種框架和產品的壽命終止日期的網站。

推文

https://twitter.com/dotnetfdn/status/1595427955076784133?s=12&t=EDTXeykhwoV--mTr9sPPxw

用於ESP32-C3的.NET nanoFramework韌體映象已經發布,它說.NET在RISC-V上執行。


Alexandre Mutel: "NativeAOT的一個超級酷的功能與...." - Mastodon

https://mastodon.social/@xoofx/109423020409800983

.NET 7的NativeAOT的一個超級酷的功能是 "直接呼叫PInvoke",或者是連結靜態庫https://github.com/dotnet/runtime/blob/main/src/coreclr/nativeaot/docs/interop.md,直接呼叫函數的能力。
在NuGet中沒有內建的支援來分發這些東西(例如執行時資料夾),但可以很容易地釋出一個包,提供動態庫,但也可以提供對靜態連結庫的支援,並通過MSBuild目標自動注入它。我喜歡這個功能!