.NET週報 【3月第1期 2023-03-03】

2023-03-06 21:01:01

國內文章

我做的FFmpeg開源C#封裝庫Sdcb.FFmpeg

https://www.cnblogs.com/sdflysha/archive/2023/02/27/dotnet-conf-china-2022-ffmpeg.html

FFmpeg是知名的音訊視訊處理軟體,我平時工作生活中會經常用到。但同時我也是.NET程式設計師,我以業界普遍使用的開源專案FFmpeg.AutoGen為基礎,我我自己動手做了一個Sdcb.FFmpeg。

記一次 .NET某家裝ERP系統 記憶體暴漲分析

https://www.cnblogs.com/huangxincheng/archive/2023/02/27/17159384.html

前段時間微信上有一位老朋友找到我,說他的程式跑著跑著記憶體會突然爆高,有時候會下去,有什麼會下不去,懷疑是不是某些情況下存在記憶體洩露,讓我幫忙分析一下,其實記憶體洩露方面的問題還是比較好解決的,看過這個dump之後覺得還是有一定的分享價值,拿出來和大家分享一下吧。

.NET AsyncLocal 避坑指南

https://www.cnblogs.com/eventhorizon/archive/2023/03/01/17170301.html

本文介紹了AsyncLocal的常見用法,常踩的坑和避坑指南,另外引入HttpContextAccessor的實現原理來介紹這些內容。

C#神器"BlockingCollection"類實現C#神仙操作

https://www.cnblogs.com/baibaomen-org/archive/2023/02/28/17162795.html

如果你想玩轉C# 裡面多執行緒,工廠模式,生產者/消費者,佇列等高階操作,就可以和我一起探索這個強大的執行緒安全提供阻塞和限制功能的C#神器類.

【C#非同步】非同步多執行緒的本質,上下文流轉和同步

https://www.cnblogs.com/1996-Chinese-Chen/archive/2023/03/02/17172773.html

net同僚對於async和await的話題真的是經久不衰,這段時間又看到了關於這方面的討論,最終也沒有得出什麼結論,其實要弄懂這個東西,並沒有那麼複雜,簡單的從本質上來講,就是一句話,async 和await非同步的本質就是狀態機+執行緒環境上下文的流轉,由狀態機向前推進執行,上下文進行環境切換,在狀態機向前推進的時候第一次的movenext會將當前執行緒的環境上下文儲存起來......

解讀C#程式設計中最容易忽略7種編寫習慣!

https://www.cnblogs.com/xiongze520/archive/2023/02/28/17164309.html

1、拼接字串 2、巢狀例外處理 3、for和foreach的選擇 4、驗證簡單的原始資料型別 5、處理物件實現IDisposable介面 6、宣告公共變數 7、利用System.Data.DataTable存取資料

.NET靜態程式碼織入——肉夾饃(Rougamo) 釋出1.4.0

https://www.cnblogs.com/nigture/p/17174199.html

肉夾饃(https://github.com/inversionhourglass/Rougamo)通過靜態程式碼織入方式實現AOP的元件,其主要特點是在編譯時完成AOP程式碼織入,相比動態代理可以減少應用啟動的初始化時間讓服務更快可用,同時還能對靜態方法進行AOP。

難譯 | windbg 樂趣之道(上、下)

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

https://mp.weixin.qq.com/s/TLrnRmnPt3Aiep-dnSF8gA

Yarden Shafir 分享了兩篇非常通俗易懂的,關於 windbg 新引入的偵錯資料模型的文章。連結如下:

part1:https://medium.com/@yardenshafir2/windbg-the-fun-way-part-1-2e4978791f9b

part2:https://medium.com/@yardenshafir2/windbg-the-fun-way-part-2-7a904cba5435

本文是第一部分的譯文。在有道詞典、必應詞典、谷歌翻譯的大力幫助下完成,感謝以上翻譯工具,我只是一個搬運工。強烈建議英文好的朋友閱讀原文,因為在翻譯的過程中不可避免的按我的理解做了調整。

.NET 8 預覽版 1 釋出!

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

.NET 8 是一個長期支援(LTS) 版本。這篇文章涵蓋了推動增強功能優先順序排序和選擇開發的主要主題和目標。.NET 8 預覽版和釋出候選版本將每月交付一次。像往常一樣,最終版本將在 11 月的某個時候在 .NET Conf 上釋出。

跨平臺ChatGpt 使用者端

https://mp.weixin.qq.com/s/F5Qb-RyxBCSEpU9uOQIEmQ

一款基於Avalonia實現的跨平臺ChatGpt使用者端 ,通過對接ChatGpt官方提供的ChatGpt 3.5模型實現聊天對話。


由於本週時間比較趕,沒有對國際板塊內容做語言標註。

主題

嘗試 Visual Studio 2022 v17.6 Preview 1 版本 - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/try-visual-studio-2022-v17-6-preview-1/

Visual Studio 2022版本17.6預覽版1已經發布。

文章介紹了該版本包含的以下新功能:

  • IDE的生產力
    • 大括號對的顏色化
    • Git行暫存器的取消階段
    • 參見GitHub問題
  • .NET
    • 在C#中使用IntelliCode的API使用範例(GitHub搜尋整合)。
    • 支援遠端偵錯的.NET Visualizer
    • ARM64裝置上的.NET MAUI工具化
  • C++ (遊戲)
    • 虛幻引擎紀錄檔檢視器
    • 程式碼分析整合--虛幻標題工具
  • C++(跨平臺)
    • CMake偵錯程式
    • Unix環境下的遠端檔案資源管理器
    • C/C++匯入嵌入式STM32CubeIDE專案

C# for Godot 4.0中的新內容

https://godotengine.org/article/whats-new-in-csharp-for-godot-4-0/

C#中的新內容與遊戲引擎Godot 4.0中的變化有關。

在Godot 4.0中,很多方面都發生了變化,最重要的是SDK從Mono變成了.NET。 行動平臺仍然是Mono執行時。 隨著這一變化,Mono模組現在被稱為.NET模組。

在許多其他變化中,原始碼生成器、整數和浮點型別、型別和成員名稱,以及向NuGet釋出程式集的.NET指南。

Sixlabors:宣佈ImageSharp 3.0.0

https://sixlabors.com/posts/announcing-imagesharp-300/

ImageSharp 3.0.0已經發布。

該版本包括各種API的簡化和高達14.4倍的效能改進等改進。ImageSharp 3.0.0以.NET 6為目標框架,結束了對傳統框架的支援,並且是第一個採用新的Six Labors Split License的版本。

微軟團隊的許可權服務遷移到.NET 6 - .NET部落格

https://devblogs.microsoft.com/dotnet/microsoft-teams-permission-service-migration-to-dotnet-6/

關於Microsoft Teams的許可權服務遷移到.NET 6的案例研究。

從.NET Framework 4.7.2到.NET 6,效能提高了100%,延遲降低了30-45%。

許可權服務是一個後端服務,在各種情況下用於評估使用者和租戶,決定他們是否可以顯示存在、新增使用者、開始聊天或建立會議,這需要嚴格的效能要求。 .NET 6. 在遷移到.NET 6之前,它是建立在Azure的經典雲服務上,採用.NET Framework 4.7.2,API是OWIN/Katana。

遷移過程、執行情況(人數和持續時間以及ServicePointManager淘汰帶來的遷移洩漏問題)、在推廣過程中看到的(在處理大量流量後,.NET 6版本的效能更好,似乎比現有版本的利用率更高)、好處(延時 改進)。

Visual Studio 2022 版本 17.5.1 | Visual Studio 2022 發行說明 | Microsoft Learn

https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-notes

Visual Studio 2022的17.5.1版已經發布。

該版本解決了17.5(.NET SDK 7.0.200)(.NET SDK 7.0.201)中 "dotnet包 "的--輸出選項的問題,以及一些修復問題。

用VisualStudio.Extensibility Preview 3構建更好的擴充套件!! - Visual Studio部落格

https://devblogs.microsoft.com/visualstudio/visualstudio-extensibility-preview-3/

宣佈VisualStudio.Extensibility預覽版3,Visual Studio的新擴充套件API/SDK。

在這個預覽版中,以下功能現在可用/已實現

  • 偵錯程式視覺化器
  • 自定義對話方塊
  • 查詢專案系統
  • 編輯器邊緣擴充套件
  • 設定擴充套件
    • 從指定屬性的模型到指定型別的屬性

加入我們的Hack Together: Microsoft Graph and .NET - .NET部落格

https://devblogs.microsoft.com/dotnet/hack-together-microsoft-graph-dotnet/

宣佈舉辦虛擬駭客馬拉松(活動),您可以在3月1日至15日期間通過使用微軟圖形和.NET建立應用程式來贏得獎品。

從3月1日至3月15日,通過提交使用微軟圖形和.NET的應用程式,有機會獲得Xbox等獎品。

釋出Plotly.NET v4.0.0 - plotly/Plotly.NET

https://github.com/plotly/Plotly.NET/releases/tag/4.0.0

Plotly.NET v4.0.0已經發布。

這個版本是在改進了可傳遞給某些圖表的資料和改變了plotly.js之後釋出的。

文章、幻燈片

"Pico Chess, start a new game": .NET語音識別教學

https://dev.to/picovoice/pico-chess-start-a-new-game-net-speech-recognition-tutorial-2jj1

來自Picovoice的.NET SDK與基於文字的國際象棋引擎ChessCore相結合,實現語音控制。

7個用於與Web3互動的.NET工具

https://medium.com/c-sharp-progarmming/7-net-tools-for-interacting-with-web3-96a921c86a21

介紹了七個區塊鏈庫(Nethereum、CardanoSharp、BlockM3、Neo、Stratis、Blockfrost.io、Nethermind),可用於.NET中。

ML.NET模型生成器中的句子相似性 - .NET部落格

https://devblogs.microsoft.com/dotnet/sentence-similarity-mlnet-model-builder/

關於在ML.NET Model Builder中處理句子相似性的能力。

用過濾器客製化RequestDelegate:最小的API的幕後 - 第八部分

https://andrewlock.net/behind-the-scenes-of-minimal-apis-8-customising-the-request-delegate-with-filters/

解釋瞭如何在ASP.NET Core中的Minimal APIs幕後處理帶有過濾器的自定義RequestDelegate。

Entity Framework中的資料載入

https://dev.to/grontis/data-loading-in-entity-framework-2foe

如何使用Microsoft.EntityFrameworkCore.Proxies在Entify Framework Core中進行懶惰載入。

在Ubuntu上用GTK做GNOME視窗中的Hello World - Qiita

https://qiita.com/hiroxpepe/items/bc4caa6b6c77f5ddf89a

在Linux上用.NET 6和GtkSharp(GTK)來顯示視窗。

新增檔案和資料夾的最快方法 - Visual Studio部落格

https://devblogs.microsoft.com/visualstudio/the-fastest-way-to-add-files-and-folders/

介紹Visual Studio 2022年版本17.5中引入的新的新增檔案對話方塊。

介紹Visual Studio中的F#內聯型別和引數名稱提示 - .NET部落格

https://devblogs.microsoft.com/dotnet/fsharp-inline-hints-visual-studio/

關於Visual Studio中對F#型別和引數名稱的內聯提示的支援。

它目前是作為一個預覽功能提供的,必須在設定中啟用才能使用它。

使用dotnet trace測量.NET應用程式使用CPU時間的位置 | @jsakamoto

https://devadjust.exblog.jp/29509340/

如何使用dotnet-trace對.NET應用程式的CPU時間進行分析。

當你想在C#中使用兩個int作為Dictionary鍵時的效能比較(鍵的範圍是[-32768, 32767])。

https://zenn.dev/zubu/articles/f594afaa3b6051

關於用兩個ints獲得的雜湊碼的Dictionary的效能及其碰撞率,比較了使用ValueTuple和HashCode等方法。

[C#] 使用Math.NET數位技術的簡單線性迴歸分析(SLR:簡單線性迴歸) - Qiita

https://qiita.com/MonaiTakeshi/items/e36c6fc232230699ff03

如何用Math.NET Numerics進行簡單線性迴歸分析。

[C#] 用Math.NET Numerics進行多元線性迴歸分析(MLR:多元線性迴歸) - Qiita

https://qiita.com/MonaiTakeshi/items/df0ce261a2ffcde71495

如何使用Math.NET Numerics進行多元線性迴歸分析。

原始字串、UTF-8字串和多行插值 - 在Rider和ReSharper中使用C# 11 | .NET工具部落格

https://blog.jetbrains.com/dotnet/2023/02/27/raw-strings-utf-8-strings-multiline-interpolations-using-csharp-11-in-rider-and- resharper/

介紹C# 11中的原始字串和UTF-8字串,多行字串補全及其在Rider和ReSharper中的支援。

C# "var" with a reference Type is Always Nullable

https://jeremybytes.blogspot.com/2023/02/c-var-with-reference-types-is-always.html

關於在C#中用var定義的變數被視為空允許的參考型別。

在BlazorServer中與所有頁面共用一個客戶的IP地址 - Qiita

https://qiita.com/takaOG/items/375d67397ddc3dc77fc9

關於如何在Blazor伺服器中獲得一個客戶的IP地址,並在頁面之間共用。

我在.NET中設定了一個gRPC伺服器。

https://zenn.dev/au/books/7cec3e306916a5

在.NET中實現一個gRPC伺服器,並做一些諸如寫入資料庫和實現攔截器的事情,這是一個分步指南。

我試著接觸了OpenTelemetry dotnet。

https://zenn.dev/k_maru/articles/first_opentelemetry_dotnet

如何用OpenTelemetry獲取和顯示ASP.NET Core應用程式的痕跡。

還介紹了呼叫外部服務和用Zipkin顯示等方法。

Blazor中的NavigationManager - Kristoffer Strube的部落格

https://kristoffer-strube.dk/post/the-blazor-navigationmanager/

Blazor NavigationManager類的解析。

在.NET 7中,新的RegisterLocationChangingHandler API。

為NuGet包寫一個高質量的README - The NuGet Blog

https://devblogs.microsoft.com/nuget/write-a-high-quality-readme-for-nuget-packages/

為NuGet包寫一個高質量的README指南。

它介紹了在README中應該寫些什麼、模板、良好的做法等,由於README現在可以在NuGet.org上顯示,這些都變得越來越重要。

關於委託

https://ericsink.com/native_aot/delegate_i32.html

關於從C語言向C#傳遞委託並在NativeAOT中呼叫它們。

用MemoryPack在Math.NET中序列化向量 - Qiita

https://qiita.com/delicioustuna/items/6cd457bbfb40254663d2

關於Formatter用MemoryPack將Math.NET的Vector<T>序列化的實現。

GitHub Copilot in Visual Studio 2022 - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/github-copilot-in-visual-studio-2022/

介紹Visual Studio 2022中GitHub Copilot更新的視訊。

用TDD構建的Roslyn Analyser [DeNA TechCon 2023].

https://speakerdeck.com/dena_tech/techcon2023-session03

解釋如何使用Dena.CodeAnalysis.Testing進行開發的會議幻燈片,它可以協助為Roslyn Analyzer單元測試編寫測試程式碼。

利用動態程式分析優化EF Core資料庫查詢 | .NET工具部落格

https://blog.jetbrains.com/dotnet/2023/03/02/optimizing-entity-framework-core-database-queries-with-dynamic-program-analysis/

瞭解如何使用動態程式分析(DPA)來優化Entity Framework Core資料庫查詢,它可以自動分析ReSharper和Rider應用程式的效能。

庫、儲存庫、工具等。

Cysharp/csbindgen: 從Rust生成C# FFI,用於自動將原生程式碼和C本地庫帶到.NET和Unity。

https://github.com/Cysharp/csbindgen

一個Rust庫,可以生成繫結,將本地C庫帶到.NET和Unity。

網站、檔案等

推文

Stack Overflow技術架構的解釋。

https://twitter.com/sahnlam/status/1629713954225405952?s=12


Visual Studio 2022 17.5版能夠像Visual Studio Code那樣從.http檔案中建立REST使用者端。

https://twitter.com/Dave_DotNet/status/1628135023722303506


Immutable和Frozen的區別。

https://twitter.com/dave_dotnet/status/1629464212194959362?s=12

不可變的集合是 "不可變的",因為一個集合的特定範例不能被改變。然而,它們確實鼓勵變異:不是變異該範例,而是從原始範例中建立新的範例。所以你會看到在不可變集合上的新增和刪除等方法,這些方法並不改變原始範例,而是建立一個包含該突變的新範例(你經常會在文獻中看到此類集合被描述為 "持久化集合")。這樣做的淨結果是,除了有一個鼓勵這種操作的表面區域外,還為這種使用優化了實現,特別是圍繞範例之間的記憶體共用。如果你有一個ImmutableDictionary<string, string>,從表面上看它是一個樹形資料結構,當你對它進行 "新增 "時,它會建立一個新的ImmutableDictionary<string, string>,它儘可能多地共用原始樹,但要有支援新增專案所需的額外節點。這意味著即使ImmutableDictionary<>是 "不可變的",它實際上並沒有為快速讀取進行優化,例如,TryGetValue是一個O(log n)操作。

另一方面,新的FrozenSet<>/FrozenDictionary<>是真正的不可變的;沒有任何API表面區域允許或鼓勵新增、刪除等。因此,它們是為你能對它們進行的唯一操作而設計的:讀取。如果你所關心的是沒有任何能夠實現任何形式的突變的API,那麼你可以只使用ToFrozenSet/Dictionary。如果你打算讓這些東西存在一段時間,並想在構造時花更多的時間把資料放入一種形式,使它們在隨後的所有讀取中更快,你可以給這些方法傳遞一個optimizeForReading:true bool,工廠會花更多的時間計算最好的儲存,使隨後的操作如TryGetValue非常快。它不需要擔心以一種能使建立派生集合的成本降低的方式來儲存資料,因為沒有執行這種操作的表面區域。

深入探索

wpf/roadmap.md at main · dotnet/wpf · GitHub

https://github.com/dotnet/wpf/blob/main/roadmap.md

2023年的WPF路線圖,包括對Windows 11支援。

版權宣告

由於筆者沒有那麼多時間對國內的一些文章進行整理,歡迎大家為《.NET週報-國內文章》板塊進行貢獻,需要推廣自己的文章或者框架、開源專案可以下方的專案地址提交Issue或者在我的微信公眾號私信。

格式如下:

  • 10~50字左右的標題
  • 對應文章或專案網址存取連結
  • 200字以內的簡介,如果太長會影響閱讀體驗

https://github.com/InCerryGit/.NET-Weekly

.NET效能優化交流群

相信大家在開發中經常會遇到一些效能問題,苦於沒有有效的工具去發現效能瓶頸,或者是發現瓶頸以後不知道該如何優化。之前一直有讀者朋友詢問有沒有技術交流群,但是由於各種原因一直都沒建立,現在很高興的在這裡宣佈,我建立了一個專門交流.NET效能優化經驗的群組,主題包括但不限於:

  • 如何找到.NET效能瓶頸,如使用APM、dotnet tools等工具
  • .NET框架底層原理的實現,如垃圾回收器、JIT等等
  • 如何編寫高效能的.NET程式碼,哪些地方存在效能陷阱

希望能有更多志同道合朋友加入,分享一些工作中遇到的.NET效能問題和寶貴的效能分析優化經驗。目前一群已滿,現在開放二群。

如果提示已經達到200人,可以加我微信,我拉你進群: ls1075

另外也建立了QQ群,群號: 687779078,歡迎大家加入。