.NET週報 【4月第4期 2023-04-23】

2023-04-26 12:00:52

國內文章

2023成都.NET線下技術沙龍圓滿結束

https://www.cnblogs.com/edisonchou/p/2023_chengdu_dotnet_club_activity_review.html

2023年4月15日週六,由MASA技術團隊和成都.NET俱樂部共同主辦的2023年成都.NET線下技術沙龍活動在成都市世紀城新會展中心知域空間舉行,共計報名人數90多人,實際到場60多人,13:30~18:00四個半小時的現場交流氛圍極好,到場的童鞋也滿載而歸,我們看到了成都.NET社群小夥伴的激情,也讓我們更加相信.NET社群的明天會更好

C#中使用CAS實現無鎖演演算法

https://www.cnblogs.com/eventhorizon/p/17338890.html

本文主要介紹了C#中使用CAS實現無鎖演演算法的方法和原理。文章首先解釋了CAS的基本概念和優勢,然後介紹了C#中使用Interlocked類的CompareExchange方法來實現CAS操作的方式,最後給出了兩個演演算法範例:計數器和佇列,分別展示瞭如何使用CAS操作來實現執行緒安全的資料結構和演演算法。

.NET無侵入自動化探針原理和主流實現

https://www.cnblogs.com/InCerry/p/about-dotnet-auto-apm-instru-impl.html

本文介紹了.NET無侵入自動化探針的原理和主流實現,主要包括以下內容:

  • APM探針的概念和作用,以及如何採集平臺相關指標和元件相關指標。
  • .NET方法注入的方式和原理,包括靜態注入和動態注入,以及各自的優缺點。
  • 基於CLR Profile API實現APM探針的原理,包括Profiler註冊、JIT編譯攔截、程式碼修改插樁、上下文傳播和資料收集等步驟。
  • CLR Profile API提供的事件和介面,以及如何使用ILRewriter工具類進行IL程式碼的分析和修改。
  • RequestReJIT方法的介紹和優勢,以及如何使用它實現動態地重新編譯方法。

本文旨在幫助開發者深入理解.NET無侵入自動化探針的技術細節和實現方式,為.NET應用程式的效能監測和優化提供參考。

ASP.NET Core Web API 流式返回,逐字顯示

https://www.cnblogs.com/cplemom/p/17269789.html

本文主要介紹了ASP.NET Core Web API 流式返回的方法和效果。文章分別用C#和js程式碼範例展示瞭如何使用流式響應返回文字和圖片內容,以及如何在使用者端實時捕獲返回的資訊。文章還簡要介紹了Websocket、SSE和長輪詢等網頁和伺服器端通訊的技術。

使用ServiceSelf解決.NET應用程式做服務的難題

https://www.cnblogs.com/kewei/p/17346228.html

本文主要介紹了ServiceSelf專案,它是一個為.NET泛型主機的應用程式提供自安裝為服務程序的能力的工具,支援windows和linux平臺。文章分別介紹了ServiceSelf的功能、自我服務安裝、自我服務解除安裝和自我服務紀錄檔監聽等特點,並給出了相關的程式碼範例。文章還對比了其他的服務生命週期包和紀錄檔提供者,並指出了ServiceSelf的優勢和精煉的api設計。

記一次 .NET 某外貿ERP 記憶體暴漲分析

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

本文主要介紹了.NET高階偵錯訓練營的一次案例分析,涉及到.NET記憶體暴漲的原因和解決方法。文章通過WinDbg工具,分析了一個.NET5的外貿ERP系統的記憶體dump檔案,發現了託管堆上有大量的無根物件和臨時物件,導致記憶體分配區域和提交區域相差過大。文章進一步定位了問題SQL語句和ORM框架FreeSql的對映機制,給出了優化建議和原理解釋。

一個可用於生產專案 基於 .NET 6 自研ORM

https://www.cnblogs.com/China-Mr-zhong/p/17342895.html

本文主要介紹了基於.NET 6自研的輕量級ORM框架Fast Framework的特點和用法。文章從專案明細、核心物件、增刪改查、Lambda表示式、資料庫紀錄檔、事務和多租戶等方面,詳細說明了該框架的優點和缺點,以及如何使用不同的方法和物件進行資料庫操作。文章還給出了開源地址和作者的聯絡方式,以及一些亮點功能和注意事項。

.NET實現解析字串表示式

https://www.cnblogs.com/Z7TS/p/17339894.html

本文主要介紹瞭如何使用System.Linq.Dynamic.Core庫來解析字串表示式並生成Lambda表示式樹。文章首先說明了功能需求和構建字串表示式的兩種方式,然後介紹了System.Linq.Dynamic.Core庫的功能、用法和檔案地址,最後淺析了該庫的原始碼實現和原理,以及一些相關的類和方法。

如何在 .NET Core WebApi 中處理 MultipartFormDataContent 中的檔案

https://www.cnblogs.com/hippieZhou/p/17316146.html

本文主要介紹瞭如何在.NET Core WebApi中處理MultipartFormDataContent中的檔案。文章分析了一個由於前端APP傳送的檔案缺少fileName欄位導致後端無法解析的問題,給出了後端的相容性處理方案,以及前端的優化建議。文章還提供了相關的程式碼範例和注意事項。

LangChain vs Semantic Kernel

https://www.cnblogs.com/shanyou/p/17338785.html

這篇文章是從開發人員的角度比較了兩個用於構建與AI整合的應用程式的庫:Semantic Kernel(SK)和LangChain。文章介紹了這兩個庫的背景、特點、優勢和不足,並給出了一些相關連結。文章的主要觀點是:

  • SK和LangChain都是為了簡化開發人員使用OpenAI等大型語言模型(LLM)的過程,提供了一些協調業務流程、管理對話歷史記錄、實現連結等功能的工具。
  • SK是由微軟創立的,主要面向C#開發人員,也支援Python,它被稱為輕量級SDK,可幫助開發人員將程式碼組織到內建於Planner中的技能、記憶和聯結器中。SK有一個官方的支援頁面和LinkedIn學習課程,還有一個MS Graph聯結器工具包,適用於需要與日曆、電子郵件、OneDrive等整合的方案。
  • LangChain是由Harrison Chase創立的,他是一個ML工程師,它支援Python和TypeScript,其中Python具有更多功能。LangChain主要是為習慣於使用筆電的ML工程師構建的,它不把自己稱為SDK,而是Model as a Service粘合劑。LangChain有一個大型的開源社群,目前已經有29k star。
  • 文章認為選擇使用哪一個庫主要取決於開發人員的技能,LLM已經將機器學習的門檻降低到普通開發人員就可以開發AI應用,SK在幫助應用開發人員開發AI方面的幫助會比LangChain更大,作者會選擇採用SK來構建AI應用。

ASP.NET Core - 快取之分散式快取

https://www.cnblogs.com/wewant/p/17114119.html

本文是基於 ASP.NET Core 框架的分散式快取的介紹,主要包括以下幾個方面:

  • 分散式快取的概念和優勢,以及與記憶體快取的區別。
  • 分散式快取的使用方法,基於 IDistributedCache 介面的抽象和擴充套件。
  • 分散式快取的接入方式,以記憶體快取和 Redis 快取為例,介紹瞭如何設定和切換不同的快取實現。
  • 分散式快取的效能測試,比較了記憶體快取、Redis 快取和記憶體快取結合 Redis 快取的效率和消耗。

【譯】ConfigureAwait FAQ

https://www.cnblogs.com/MeteorSeed/p/17327465.html

本文是關於 .NET 中 async/await 的 ConfigureAwait 方法的常見問題解答,主要涵蓋了以下內容:

  • SynchronizationContext 和 TaskScheduler 的概念和作用,以及它們如何影響 await 的行為。
  • ConfigureAwait 方法的含義和用法,以及它如何通過傳入一個布林值來控制是否在原始上下文或排程器上執行回撥。
  • 使用 ConfigureAwait(false) 的好處,包括效能提升和死鎖避免,以及使用 ConfigureAwait(true) 的場景。
  • 使用 ConfigureAwait(false) 的指導原則,即在通用庫程式碼中使用,在應用程式級程式碼中不使用。
  • 使用 ConfigureAwait(false) 的侷限性和注意事項,例如它不會影響 ExecutionContext 和 AsyncLocal 的流動,它不會保證回撥不會在原始上下文中執行,它需要在每個 await 處使用等。
  • 使用其他技巧來替代或輔助 ConfigureAwait(false) 的可能性和風險,例如使用 Task.Run, SynchronizationContext.SetSynchronizationContext, Task.GetAwaiter().GetResult 等。

記一次 .NET某醫療器械清洗系統 卡死分析

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

本文是一篇關於.NET程式卡死分析的技術部落格,作者分享了一個.NET某醫療器械清洗系統卡死的案例,介紹瞭如何使用windbg工具觀察核心態和使用者態的執行緒棧,定位到卡死的原因是非主執行緒建立了一個使用者控制元件,導致核心態在某種情況下給它發訊息。作者提供瞭解決辦法,並總結了這個案例的經驗教訓。

C# 如何設計一個好用的紀錄檔庫?【架構篇】

https://www.cnblogs.com/czzj/p/JGP_MyLog.html

本文介紹了C#如何設計一個好用的紀錄檔庫,分別介紹了紀錄檔的簡單記錄、通過開源庫HslCommunication和NLog實現不同級別和選項的紀錄檔記錄,以及使用TextAnalysisTool.NET進行紀錄檔檢視和分析的方法。本文旨在幫助開發者提高紀錄檔記錄的技能和效率,提高程式的穩定性和可維護性。

主題

【英文】Windows 社群工具包 2023 更新 - #ifdef Windows

https://devblogs.microsoft.com/ifdef-windows/the-windows-community-toolkit-2023-update/

關於 Windows 社群工具包更新。

它引入了新的 WCT Lab 元件、下一個版本中的元件以及名稱空間的統一。

文章、幻燈片等

【日文】我嘗試建立一個可以使用 Azure Functions 和 LINE Messaging API 與 ChatGPT 通訊的服務

https://zenn.dev/takunology/articles/linebotandazure-gpt

瞭解如何使用 Azure Functions 和 OpenAI 的 ChatGPT API 實現 LINE 機器人。

【日文】使用 SetWindowSubclass 的自定義視窗過程 (C# / WinUI 3)

https://zenn.dev/shinta0806/articles/de27f23a0c3684

如何在 WinUI 3 應用程式中執行自定義視窗過程(子類化視窗)。

【日文】如何輕鬆偵錯 Windows 服務 - Qiita

https://qiita.com/TheParkSider/items/dc0aa0a03c02cec462e6

如何在實施 Windows 服務時簡化偵錯。

【英文】改進 Visual Studio 中 JavaScript 的語法突出顯示 - Visual Studio 部落格

https://devblogs.microsoft.com/visualstudio/improving-the-syntax-highlighting-of-javascript-in-visual-studio/

在 Visual Studio 2022 v17.6 及更高版本中引入了對 JavaScript 語法突出顯示的改進。

【英文】如何在 Rider 中使用 Aqua Web Inspector 進行 ASP.NET Core 開發 | .NET 工具部落格

https://blog.jetbrains.com/dotnet/2023/04/20/jetbrains-rider-and-aqua-for-aspnetcore-development/

如何使用 IDE 的內建 Web 檢查器通過 Rider 中提供的 JetBrains Aqua 外掛進行 ASP.NET Core 開發。

【英文】Git 工具預覽功能以提高生產力 - Visual Studio 部落格

https://devblogs.microsoft.com/visualstudio/git-tooling-preview-features-to-enhance-productivity/

Visual Studio(預覽版)中與 Git 相關的增強功能彙總。

【英文】使用 ReSharper 減少集合查詢 | .NET 工具部落格

https://blog.jetbrains.com/dotnet/2023/04/18/reduce-lookups-in-hashset-dictionary-and-other-collections-with-resharper/

關於 ReSharper 指出在操作 Dictionary 和 HashSet 等集合之前呼叫 ContainsKey 和 Contains 的不必要情況的能力。

【英文】.NET Web 檢視控制元件中的 Chrome 擴充套件

https://dev.to/dotnetbrowser/chrome-extensions-in-net-web-view-controls-11lm

關於DotNetBrowser、WebView2、CefSharp等WebView中Chrome擴充套件的支援情況。

【英文】使用 Serilog 格式化 .Net 應用程式紀錄檔並將其傳送到 Elasticsearch

https://medium.com/@ingrid.jardillier/format-and-send-net-application-logs-to-elasticsearch-using-serilog-9819742cf806

設定 Serilog 以將紀錄檔傳送到 Elasticsearch 的說明。

【日文】從記憶體轉儲中檢查 .NET 應用程式用於 HTTP 通訊的代理設定 - Qiita

https://qiita.com/nishiseki/items/fe3e4795df9f790831f7

如何獲取 .NET 應用程式的記憶體轉儲並從記憶體轉儲中解析 HTTP 代理設定資訊。

【英文】使用 Kubernetes 執行非 root .NET 容器 - .NET 部落格

https://devblogs.microsoft.com/dotnet/running-nonroot-kubernetes-with-dotnet/

它通過範例介紹了 .NET 8 支援的 Kubernetes 上非根容器的使用。它也應該與 dotnet-monitor 一起工作。

【日文】[Xamarin/C#] 在智慧手機上建立一個VR照片展示應用

https://zenn.dev/daddy_yukio/articles/a70e04b8896f15

關於用Xamarin.Forms顯示360度球面影象的實現。

【英文】為 .NET SDK 專案設定絕對輸出路徑

https://weblog.west-wind.com/posts/2023/Apr/21/Setting-an-Absolute-Output-Path-for-NET-SDK-Projects

關於構建時如何指定輸出目標路徑,以及如何通過AppendTargetFrameworkToOutputPath指定不將目標框架新增到路徑中。

【英文】使用自定義集合調查 Enumerable.LastOrDefault 中的崩潰 - Gérald Barré

https://www.meziantou.net/investigating-a-crash-in-enumerable-lastordefault.htm

討論在自定義集合上使用 LINQ LastOrDefault 方法時非執行緒安全操作引發異常的情況。

【英文】.NET 8 效能版

https://steven-giesel.com/blogPost/f6504300-7bf0-48d2-8a14-ba4e2bbea02e

.NET 8 和更早版本在列舉、LINQ、反射和列表等領域的基準效能比較。

【日文】用於 Azure OpenAI 服務的 C# SDK(也可用於 ChatGPT)

https://zenn.dev/microsoft/articles/azure-openai-service-csharpsdk

一篇關於開始使用 Azure OpenAI 服務的 .NET SDK(包括 ChatGPT)的文章。

【日文】在 C# 中建立帶有 QR 影象的 Excel(NPOI、ZXing)

https://zenn.dev/junnuj/articles/a68409f9e18fd0

如何使用 ZXing.NET 生成二維條碼並使用 NPOI 在 Excel 中嵌入影象。

【日文】使用語意核心輕鬆連結 GPT 和外部工具 - 技術主題的味道

https://acro-engineer.hatenablog.com/entry/2023/04/18/120000

如何使用 Semantic Kernel 整合 ChatGPT API 和外部工具 Elasticsearch。

【雜記】清除賦值規則 |不明航班C部落格

https://ufcpp.net/study/csharp/start/definiteassignment/

關於避免未初始化的顯式分配規則。它還提到了 C# 10 中的改進。

庫、儲存庫、工具

microsoft/Tokenizer:用於 OpenAI LLM 的 BPE 標記器的 .NET 實現。

https://github.com/microsoft/Tokenizer

OpenAI 的 tiktoken 令牌計數庫的 .NET 實現。

CalvinAllen/vs4mac-super-clean:Super Clean 是 Visual Studio for Mac 的一個擴充套件,當它被觸發時,會完全清除解決方案中所有專案的 bin 和 obj 目錄

https://github.com/CalvinAllen/vs4mac-super-clean

用於刪除所有 obj 和 bin 目錄的 Visual Studio for Mac 擴充套件。

bUnit-dev/bUnit:bUnit 是 Blazor 元件的測試庫,它使測試看起來、感覺起來和執行起來都像常規單元測試。bUnit 使呈現和控制被測元件的生命週期、傳遞引數和將服務注入其中,觸發事件處理程式,並使用內建的語意 HTML 比較器驗證從元件呈現的標記。

https://github.com/bUnit-dev/bUnit

使 Blazor 元件更易於測試的庫。

版權宣告

由於筆者沒有那麼多時間對國內的一些文章進行整理,歡迎大家為《.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,歡迎大家加入。