.NET週刊【9月第4期 2023-09-24】

國內文章

有趣的“可擴展近似計數”算法

https://zhuanlan.zhihu.com/p/656817283

在編程的世界裏看見數學的身影,會讓我充滿好奇和興奮。這不,在一年一度介紹.NET新版本的官方開發博客《Performance Improvements in .NET 8》中,我看到了這樣一個有趣的算法:可擴展近似計數(Scalable Approximate Counting)。

【逆向專題】(一)使用C#+Win32Api實現進程注入到wechat

https://www.cnblogs.com/1996-Chinese-Chen/p/17715870.html

本文主要介紹瞭如何使用Flaui實現微信自動化,破解Windows微信的本地Sqlite數據庫,並使用Openssl和Win32Api獲取解密密鑰。文章詳細解釋瞭如何使用Cheat Engine軟件獲取微信的靜態數據,包括微信暱稱、微信號、手機號和所在地區等。同時,文章還介紹瞭如何使用C#代碼獲取靜態數據,並通過遠程注入調用自己編寫的庫。最後,文章列舉了在這個過程中需要用到的所有Win32Api函數,並詳細解釋了每個函數的用途和參數。

關於.Net 6.0 在Linux ,Docker容器中,不安裝任何依賴就生成圖形驗證碼

https://www.cnblogs.com/Thayou/p/17717102.html

本文介紹了在.Net 6中使用SkiaSharp生成驗證碼的過程。作者首先提到在.Net Framework時代,驗證碼的生成主要依賴於System.Drawing,但這個庫依賴於Windows GDI+,不利於跨平臺使用。因此,作者選擇使用微軟推薦的SkiaSharp庫。作者詳細介紹瞭如何使用SkiaSharp生成驗證碼的代碼,並在Windows機器上成功運行。然而,在部署到Linux環境時遇到了問題,因爲SkiaSharp在Linux上需要一些依賴,而這些依賴在內網環境下難以安裝。作者通過使用SkiaSharp.NativeAssets.Linux.NoDependencies這個nuget包解決了依賴問題,但在Linux上生成的驗證碼沒有文字。最後,作者發現Linux上沒有字體文件,提出了提供一個字體文件讓程序指定讀取的解決思路。

2023版:深度比較幾種.NET Excel導出庫的性能差異

https://www.cnblogs.com/baibaomen-org/p/17721587.html

本文深度比較了幾種.NET Excel導出庫的性能差異,包括EPPlus、NPOI、Aspose.Cells和DocumentFormat.OpenXml。這些庫的開源情況、許可證和支持的Excel版本都有所不同。文章還詳細介紹了測評電腦的配置,包括CPU、內存、操作系統等信息。爲了進行性能測評,作者使用Bogus庫生成了6萬條標準化的測試數據,並創建了公共類以便於測評使用。通過這種方式,開發人員可以根據實際的性能指標和數據選擇最適合自己的電子表格處理庫。

深度比較常見庫中序列化和反序列化性能的性能差異

https://www.cnblogs.com/baibaomen-org/p/17710883.html

本文介紹了四個常用的序列化和反序列化庫,包括System.Text.Json、Newtonsoft.Json、Protobuf-Net和MessagePack-Net,並對它們進行了性能測試。System.Text.Json是.NET Core 3.0及以上版本的內置JSON庫,Newtonsoft.Json是.NET中最常用的JSON序列化庫,Protobuf-Net是.NET版本的Google's Protocol Buffers序列化庫,MessagePack-Net是一個高效的二進制序列化格式。性能測試包括內存分配和執行時間的測量,以及生成隨機數據的函數。測試結果顯示,System.Text.Json的文件大小爲14.3MB,分配內存爲1,429,688,200,內存提高爲67,392,耗時爲2494毫秒。

【.NET8】訪問私有成員新姿勢UnsafeAccessor(上)

https://www.cnblogs.com/InCerry/p/dotnet8-access-private-member-new-method-1.html

本文介紹了.NET8中新增的特性UnsafeAccessor,它可以訪問私有成員。在.NET8之前,訪問私有成員的方法包括反射、Emit和Expression,但這些方法性能較差或代碼複雜。而UnsafeAccessor通過定義一個static extern ref方法,並在方法上添加UnsafeAccessor特性,可以直接訪問私有成員,性能更好,代碼更簡潔。此外,UnsafeAccessor還可以訪問私有構造方法和私有的方法,提供了更多的可能性。

C#開源、功能強大、免費的Windows系統優化工具 - Optimizer

https://www.cnblogs.com/Can-daydayup/p/17726833.html

本文推薦了一款由C#開源的Windows系統優化工具 - Optimizer。Optimizer功能強大,可以提高計算機性能,加強隱私和安全保護。它支持22種語言,提供了許多實用功能,如關閉不必要的Windows服務、停止Windows自動更新、卸載UWP應用、清理系統垃圾文件和瀏覽器配置文件、修復常見的註冊表問題等。此外,Optimizer還提供了硬件檢測工具、IP連通性和延遲測試工具、快速更改DNS服務器、編輯HOSTS文件、識別和終止文件鎖定句柄等實用工具。Optimizer的本體只有2M多的大小,不用安裝,打開即用。

.NET 8 的 green thread 異步模型被擱置了

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

.NET平臺上的green thread異步模型實驗結果表明,雖然在.NET和ASP.NET Core中實現Green Thread是可行的,但Green Thread與現有的異步模型async/await之間的交互非常複雜,因此決定暫停綠色線程試驗,繼續改進現有的async/await模型。文章指出,.NET的異步編程模型簡化了應用程序的異步代碼編寫,對於增強I/O綁定方案的可伸縮性非常關鍵。Green thread的目的是簡化編程模型,使得所有代碼可以以同步方式編寫,但仍保持可伸縮性和性能。然而,Green thread與現有的異步模型之間的交互是複雜的,特別是從Green thread代碼調用異步方法需要轉換到異步代碼的同步模式,這在常規線程上不是一個好的選擇。

記一次 .NET 某電力系統 內存暴漲分析

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

本文主要講述了作者幫助朋友解決程序內存暴漲問題的過程。首先,作者通過抓取程序的內存dump來分析問題。然後,使用Windbg工具進行分析,通過命令“!address -summary”查看程序的內存使用情況,發現內存使用並不多。接着,通過命令“!eeheap -gc”觀察託管堆,發現問題出在託管層。最後,通過命令“!dumpheap -stat”查看託管堆的現狀,發現一個1.69G的Free對象佔用了大量內存。爲了找出原因,作者決定進一步觀察這個Free對象的分佈情況。

記一次 .NET 某餐飲小程序 內存暴漲分析

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

本文主要講述了作者幫助朋友分析程序內存異常高的問題。首先,作者使用vs診斷工具查看了程序的內存使用情況,發現託管堆的內存佔用高達10G+,主要是由於Small object heap的內存佔用過高。進一步分析發現,xxxxxxLogEntity對象數量高達5063萬,佔據了6G的內存。通過使用!gcroot命令,作者發現這些對象的根可能在線程棧裏。最後,作者建議進一步觀察託管堆,看看哪個對象的佔比最大。

【.NET8】訪問私有成員新姿勢UnsafeAccessor(下)

https://www.cnblogs.com/InCerry/p/dotnet8-access-private-member-new-method-2.html

本文討論了.NET8中新增的UnsafeAccessor的性能測試。通過BenchmarkDotNet進行測試,包括使用UnsafeAccessor特性、反射、Emit+動態方法、表達式樹+委託以及直接訪問私有成員等方法。UnsafeAccessor可以方便地訪問私有成員,但也存在一些侷限性。本文通過實際代碼和測試,對其性能進行了深入的探討。

理解並掌握C#的Channel:從使用案例到源碼解讀(一)

https://www.cnblogs.com/yyfh/p/mastering-csharp-channels-part-one.html

本文介紹了C#併發編程中的Channel數據結構,通過兩個實際案例展示了其使用方法和優勢。第一個案例是文件遍歷和過濾,通過創建有界和無界的Channel,實現了文件的並行遍歷和過濾,提高了程序性能和響應性。第二個案例是Excel文件的讀取和翻譯,通過異步數據流處理,提高了翻譯效率。這兩個案例都展示了Channel在解耦任務和提高程序性能方面的優勢。

4款免費且實用的.NET反編譯工具

https://www.cnblogs.com/Can-daydayup/p/17723508.html

本文介紹了四款.NET反編譯工具:ILSpy、dnSpy、JetBrains dotPeek和JustDecompile。這些工具可以將已編譯的.NET程序集轉換爲易於理解的源代碼,幫助開發人員恢復丟失的源代碼、理解和分析第三方組件dll、學習其他人的代碼、查找修復bug或進行逆向工程。每款工具都有其特點,選擇哪一款取決於個人的偏好和需求。同時,文章強調在法律允許的範圍內合理使用這些工具,並保護他人的知識產權。最後,文章還提供了一個.NET技術交流羣,供開發者分享經驗、學習資料和交流問題。

C#集成ViewFaceCore人臉檢測識別庫

https://www.cnblogs.com/deali/p/17716884.html

本文介紹了在C#上使用ViewFaceCore庫進行人臉檢測和識別的過程。ViewFaceCore是基於SeetaFace6的.NET人臉識別解決方案,支持年齡預測、眼睛狀態檢測、性別預測、人臉檢測、口罩檢測等功能。在C#中使用非常簡單,但由於調用了C++的庫,部署時可能會遇到一些問題。文章詳細記錄瞭如何添加依賴、進行人臉檢測、使用ImageSharp圖片庫等步驟,並提供了相關代碼示例。

[MAUI]實現動態拖拽排序網格

https://www.cnblogs.com/jevonsflash/p/17712687.html

本文介紹瞭如何使用.NET MAUI實現實時拖拽排序功能。首先,創建一個.NET MAUI項目,然後在頁面中創建CollectionView控件作爲Tile的容器。接着,設置DropGestureRecognizer中的拖拽懸停、離開、放置時的命令,並創建IDraggableItem接口,定義拖動相關的屬性和命令。最後,創建一個TileSegement類,用於描述磁貼可顯示的屬性,如標題、描述、圖標、顏色等。這樣,當拖拽條目放置在另一個條目上方時,即可將條目位置變更,實現實時拖拽排序。

如何在沒有第三方.NET庫源碼的情況,調試第三庫代碼?

https://www.cnblogs.com/Dotnet9-com/p/17723454.html

本文由沙漠盡頭的狼首發於Dotnet9,介紹瞭如何使用dnSpy調試第三方.NET庫源碼。dnSpy是一款強大的.NET程序反編譯工具,可以在沒有源碼的情況下調試程序,甚至修改程序。文章通過一個示例程序,詳細介紹瞭如何安裝dnSpy,編寫示例程序,調試示例程序和.NET庫原生方法。此外,dnSpy還能直接監視第三方代碼的變量、修改值等,就像使用VS開發自己的程序一樣。文章最後,作者提到了如何在沒有源碼的情況下糾正示例程序中的錯誤,並預告了下一篇文章將講解第三方庫攔截,實現不修改第三方庫達到修改方法邏輯和返回結果的效果。

記一次 .NET 某儀器測量系統 CPU爆高分析

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

本文主要討論了CPU爆高的問題。作者分享了兩個案例,通過WinDbg工具進行分析。首先,作者提醒我們,別人說CPU爆高不一定真的爆高,我們需要用數據說話。然後,作者通過觀察線程池中的所有工作線程,發現所有線程都在全力運行。通過仔細觀察各個線程的線程棧,作者發現最多的是某個方法。這個方法是由線程池工作線程創建的。最後,作者通過分析代碼,找出了CPU爆高的原因:一是無腦往線程池丟任務,導致線程增多;二是線程中方法的時間複雜度高。

關於Unity 如何與Blazor Server結合

https://www.cnblogs.com/LinSr/p/17717402.html

本文詳細介紹瞭如何將Unity與Blazor Server結合的過程。首先,創建一個Unity項目並進行發佈設置,然後將Unity項目發佈爲WebGL。接着,創建一個net7.0的Blazor Server項目,並在Program.cs中進行配置,將Unity作爲靜態文件引入。最後,將Unity項目的Build文件夾拷貝到Blazor Server的項目根目錄下,並修改目錄名稱爲BlazorServerTest。完成這些步驟後,啓動Blazor Server項目,在地址欄輸入相應的URL,即可看到Unity畫面。通過這種方式,成功實現了Blazor Server和Unity的結合。

【C#版本Openfeign】.NET 8 自帶OpenFeign實現遠程接口調用

https://www.cnblogs.com/1996-Chinese-Chen/p/17724792.html

本文介紹了.Net 8中的新功能AutoClient,這是一個內置的OpenFeign,可以自動生成代理類,調用遠程Api接口。使用AutoClient,我們只需要定義一個接口,添加AutoClient特性,系統就會自動生成一個對應的類。例如,我們定義了一個名爲IBussiness的接口,並添加了AutoClient特性,系統就會自動生成一個名爲Bussiness的類,包含了我們定義的TestPost方法和路由信息。這個功能使得調用遠程Api接口變得更加簡單和高效。

前端設計模式:單例模式(Singleton)

https://www.cnblogs.com/anding/p/17625710.html

本文介紹了單例模式,這是一種設計模式,全局或某一作用域範圍內只有一個實例對象,可以減少內存開銷。單例模式在全局狀態vuex,Jquery中的全局對象$,瀏覽器中的window、document等場景中常見。實現單例模式的關鍵是保證對象實例只創建一次,後續的引用都是同一個實例對象。實現方式有全局對象、構造函數.靜態方法getInstance、閉包-new和ES6模塊Module等。全局對象方式簡單,但會存在全局污染,不推薦使用。構造函數.靜態方法getInstance方式通過構造函數的靜態方法來獲取實例,唯一實例對象存儲在構造函數的instance上。閉包-new方式利用JS的閉包來保存唯一對象實例。ES6模塊Module方式中,模塊中導出的對象就是單例的,多次導入其實是同一個引用。

如何在.NET電子表格應用程序中創建流程圖

https://www.cnblogs.com/powertoolsteam/p/17711691.html

本文介紹瞭如何在.NET WinForms應用程序中創建流程圖。流程圖是一種圖形化工具,用於展示過程中的事件、決策和操作的順序和關係。在.NET WinForms中創建流程圖的步驟包括設置項目、啓用增強形狀引擎、添加形狀和文本到電子表格流程圖、應用樣式到形狀、分組流程圖形狀,以及在應用程序中保存並顯示流程圖。這些步驟可以通過Visual Studio軟件和電子表格設計器組件來完成。最後,還可以將創建的流程圖導出爲Excel文件,或者導入現有的Excel文件流程圖。

主題

Docker Desktop 4.23:Docker Init 更新、新配置完整性檢查、快速搜索改進、性能增強等 | Docker

https://www.docker.com/blog/docker-desktop-4-23/

Docker Desktop 4.23 已發佈。

此版本在 docker init 中添加了對 ASP.NET Core 的支持,從而可以更輕鬆地創建項目中容器化所需的 Dockerfile 和其他文件。

.NET 8 中 System.Text.Json 的新增功能 - .NET 博客

https://devblogs.microsoft.com/dotnet/system-text-json-in-dotnet-8/

.NET 8 中 System.Text.Json 的新增功能。

  • 改進的源生成器
    • 支持“required”和“init”成員
    • 源發生器組合
    • 支持不可發音的類型名稱
    • JsonStringEnumConverter<TEnum>
    • JsonSourceGenerationOptionsAttribute 功能增強
    • 默認禁用反射
    • 尺寸減小
    • Bug修復
  • 只讀成員集合
  • 處理不存在的成員
  • 蛇箱和烤肉串命名政策
  • 接口層次結構支持
  • 內置支持“Half”、“Int128”、“UInt128”
  • 內置支持 Memory<T>ReadOnlyMemory<T>
  • JsonSerializerOptions 一次性分析器
  • 擴展了對非公共成員的“JsonIncludeAttribute”和“JsonConstructorAttribute”支持
  • IJsonTypeInfoResolver.WithAddedModifier
  • JsonSerializerOptions.MakeReadOnly()
  • JsonNode 的附加功能
  • JsonNode.ParseAsync API
  • 對“System.Net.Http.Json”的改進
    • IAsyncEnumerable 擴展
    • 重載接受“JsonTypeInfo”的“JsonContent.Create”
  • JsonConverter.Type 屬性
  • 性能改進

HTTPS 無處不在更新 - NuGet 博客

https://devblogs.microsoft.com/nuget/https-everywhere-update/

更新以在 NuGet 上強制使用 HTTPS。

在 NuGet 6.8 中,可以通過在指定源時在“allowInsecureConnections”屬性中指定“true”來允許非 HTTP 連接。

新的 React TypeScript SPA 模板等 - Visual Studio 博客

https://devblogs.microsoft.com/visualstudio/new-react-typescript-spa-templates-and-more/

在 Visual Studio 2022 預覽版中使用 TypeScript 更新了 React SPA 應用程序的模板。

通過使用 Vite,新模板的創建和運行速度將更快,並且還有其他好處。

發佈 Windows App SDK 1.4.1 (1.4.230913002) · microsoft/WindowsAppSDK

https://github.com/microsoft/WindowsAppSDK/releases/tag/v1.4.1

Windows App SDK 1.4.1 已發佈。

此版本修復了多個錯誤。

Azure Service Fabric 10.0 版本 | Azure 更新 | Microsoft Azure

https://azure.microsoft.com/en-us/updates/azure-service-fabric-100-release/

Azure Service Fabric 10.0 已發佈。

文章、幻燈片等

收聽 C# 認證培訓系列 - .NET 博客

https://devblogs.microsoft.com/dotnet/csharp-certification-training-series/

推出直播會議來慶祝 freeCodeCamp 推出 C# 認證培訓。

檢查 .NET 8 + ASP.NET Core + EFCore 的啓動速度 - Qiita

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

研究組合 .NET 8、ASP.NET Core 和 Entity Framework Core 時的啓動性能。

本文還包括使用 Dapper、普通 ADO.NET 和 NativeAOT 構建的結果。

Godot 不是新的 Unity - Godot API 調用的剖析

https://sampruden.github.io/posts/godot-is-not-the-new-unity/

關於C# API調用效率低下的觀點,以Godot的raycast部分爲例。

https://x.com/reduzio/status/1704875838833897788?s=12

使用 Entity Framework Core 進行急切、延遲和顯式加載 | .NET 工具博客

https://blog.jetbrains.com/dotnet/2023/09/21/eager-lazy-and-explicit-loading-with-entity-framework-core/

解釋 Entity Framework Core 中的急切加載、延遲加載和顯式加載。

使用 AddTransient 添加的類的 Dispose 何時被調用? - Qiita

https://qiita.com/karuakun/items/4f300d84e366a125c60d

關於何時爲使用 AddTransient 添加到 Microsoft.Extensions.DependencyInjection 容器的類型調用 Dispose。

使用 C# 在 Vulkan 中進行光線追蹤 — 第 1 部分

https://jenskrumsieck.medium.com/raytracing-in-vulkan-using-c-part-1-997cb284f7e8

有關在 C# 中使用 Vulkan 實現光線跟蹤的系列。

嘗試爲 .NET8 創建 DevContainer - Qiita

https://qiita.com/karuakun/items/4695cfbdfbf623600c98

瞭解如何爲 .NET 8 創建開發容器。

[C#/Windows] 一個關於使用 DateTime 的 ToString 陷入西方/日本日曆(Windows 設置)陷阱的故事 - Qiita

https://qiita.com/nobushi95/items/c4d5877fadef29c16d74

關於 DateTime 自定義格式中的年份 (yyyy),這取決於 Windows 格式。

使用新的“while!”關鍵字簡化 F# 計算 - .NET 博客

https://devblogs.microsoft.com/dotnet/simplifying-fsharp-computations-with-the-new-while-keyword/

關於使用新的“while!”關鍵字簡化 F# 計算表達式。

IntelliTest 簡化了單元測試的編寫和維護 - Visual Studio 博客

https://devblogs.microsoft.com/visualstudio/intellitest-simplizes-writing-and-maintaining-unit-tests/

關於 Visual Studio Enterprise Edition 中提供的新 IntelliTest(測試用例生成)。

新的 IntelliTest 現在支持在 .NET 6 (x64) 上作爲預覽版運行。

使用 OpenTelemetry 觀察 .NET 微服務 - 日誌、跟蹤和指標

https://blog.codingmilitia.com/2023/09/05/observing-dotnet-microservices-with-opentelemetry-logs-traces-metrics/

關於使用 OpenTelemetry 和 Grafana 進行日誌和跟蹤、指標收集和測量。本文還介紹瞭如何使用自定義跟蹤和指標。

【雜記】InlineArray

https://ufcpp.net/study/csharp/datatype/inline-array/

C# 12 中的新功能 InlineArray 的說明。

您應該使用 .NET 8 Identity API 端點嗎?

https://andrewlock.net/should-you-use-the-dotnet-8-identity-api-endpoints/

.NET 8 Identity API 端點是什麼以及是否應該使用它們?

作者表示,.NET 8 發佈時可用的版本存在多個問題,無法推薦。

[C#] 使用TaskCompletionSource 時需要注意的事項。 - 尼諾的花園。

https://blog.neno.dev/entry/2023/09/17/191002

關於哪個線程執行TaskCompletionSource繼續處理的注意事項和推薦設置。

如何在 Windows 11 上的 Docker Desktop (KinD) 中使用 YARP 作爲 Kubernetes 中的入口控制器

https://blog.baslijten.com/how-to-deploy-yarp-ingress-controller-on-kubernetes-in-docker-desktop-kind/

如何在 Docker Desktop 中使用 Yarp 作爲 Kubernetes 的入口。

庫、存儲庫、工具等。

Cysharp/PrivateProxy:源生成器和基於 .NET 8 UnsafeAccessor 的高性能強類型私有訪問器,用於單元測試和運行時。

https://github.com/Cysharp/PrivateProxy

源生成器,生成用於使用 .NET 8 的 UnsafeAccessor 訪問私有成員的代理。

推文

關於嘗試在 Linux 上運行 Blazor Hybrid 和 .NET MAUI 的故事。

https://x.com/jsuarezruiz/status/1704037700435611699?s=12

image-20230928211843331


請注意,除非已釋放,否則枚舉器可能不會釋放資源。

https://x.com/steplyakov/status/1703814740374679858?s=12

image-20230928211910571


一種允許您使用 C# 12 集合文字在堆棧上分配特定長度的 Span 的技術。

https://x.com/davidfowl/status/1703437753390924070?s=12

image-20230928211954391

版權聲明

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

抽獎送書活動預熱!!!

感謝大家對我公衆號的支持與陪伴!爲慶祝公衆號一週年,抽獎送出一些書籍,請大家關注公衆號後續推文!

image-20230703203249615

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章