.NET周报【11月第4期 2022-11-30】

国内文章

.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的成绩取得了第一名。

image-20221130223058274

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#中的机器学习代码完成。

image-20221130205657190

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。 其他错误也得到了修复,在为正式发布做准备。

image-20221130205823618

文章、幻灯片

.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压缩可执行文件。

image-20221130212147328

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开发的插件。 提供了预览和模板。

image-20221130212427346

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上运行。

image-20221130212931756


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目标自动注入它。我喜欢这个功能! 😎

.NET 7的NativeAOT谈到了.NET 7支持直接的P/Invoke调用和静态库链接的讨论。

版权声明

由于笔者没有那么多时间对国内的一些文章进行整理,欢迎大家为《.NET周报-国内文章》板块进行贡献,需要推广自己的文章或者框架、开源项目可以下方的项目地址提交Issue或者在我的微信公众号私信。

格式如下:

  • 10~50字左右的标题
  • 对应文章或项目网址访问链接
  • 200字以内的简介,如果太长会影响阅读体验

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

.NET性能优化交流群

相信大家在开发中经常会遇到一些性能问题,苦于没有有效的工具去发现性能瓶颈,或者是发现瓶颈以后不知道该如何优化。之前一直有读者朋友询问有没有技术交流群,但是由于各种原因一直都没创建,现在很高兴的在这里宣布,我创建了一个专门交流.NET性能优化经验的群组,主题包括但不限于:

  • 如何找到.NET性能瓶颈,如使用APM、dotnet tools等工具
  • .NET框架底层原理的实现,如垃圾回收器、JIT等等
  • 如何编写高性能的.NET代码,哪些地方存在性能陷阱

希望能有更多志同道合朋友加入,分享一些工作中遇到的.NET性能问题和宝贵的性能分析优化经验。由于已经达到200人,可以加我微信,我拉你进群: ls1075

posted @ 2022-12-01 09:48  InCerry  阅读(1326)  评论(4编辑  收藏  举报