.NET周报【12月第2期 2022-12-15】
国内文章
九哥聊Kestrel网络编程第一章:开发一个Redis服务器
https://mp.weixin.qq.com/s/HJYnBE-7wbvkAYHxQaq3eQ
我和拥有多个.NET 千星开源项目作者九哥一拍即合,为了让更多的人了解 Kestrel,计划写一系列的文章来介绍它;本文是九哥发布的第一篇,通过 Kestrel 实现一个 Redis 的伪服务器,带大家了解 Kestrel 除了承载 HTTP 协议,还有其它更多的可能性,DotNetty 能做到的,Kestrel 同样也可以。
用最少的代码打造一个Mini版的gRPC框架
https://www.cnblogs.com/artech/p/16950268.html
在《用最少的代码模拟gRPC四种消息交换模式》中,我使用很简单的代码模拟了gRPC四种消息交换模式(Unary、Client Streaming、Server Streaming和Duplex Streaming),现在我们更近一步,试着使用极简的方式打造一个gRPC框架(github地址)。这个gRPC是对ASP.NET Core gRPC实现原理的模拟,并不是想重新造一个轮子。
玩好.NET高级调试,你也要会写点汇编
https://www.cnblogs.com/huangxincheng/p/16965632.html
.NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多还是用微软的 MASM + DosBox
搭一个 8086 的环境,这玩意距今快 50 年了,今天为大家介绍介绍。
为什么推荐Kestrel作为网络开发框架
https://www.cnblogs.com/kewei/p/16955086.html
网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestrel呢?
天坑,这样一个lambda随机取数据也有Bug
https://www.cnblogs.com/rupeng/p/16961982.html
前几天,一位网友跟我说他编写的一段很简单的代码遇到了奇怪的Bug,他要达到的效果是从一个List中随机取出来一条数据,代码很简单但是有BUG,带大家一起了解下。
.NET性能优化-ArrayPool同时复用数组和对象
https://www.cnblogs.com/InCerry/p/use-arraypool-with-naver-clear-array.html
大佬您好,之前读了您的文章受益匪浅,我们有一个项目经常占用 7-8GB 的内存,使用了您推荐的ArrayPool
以后降低到 4GB 左右,我还想着能不能继续优化,于是 dump 看了一下,发现是ArrayPool
对应的一个数组有几万个对象,这个类有 100 多个属性。我想问有没有方法能复用这些对象?感谢!
推荐一个使用 .NET 6 开发的开源媒体系统
https://mp.weixin.qq.com/s/_3LWLTa2Oyn0jwdIuJ1zsw
Jellyfin 是一个使用.NET6编写的免费的媒体系统,它可以让您更好的管理媒体,包括电影,音乐,图书,照片等,它是 Emby 和 Plex 的替代方案,在 Github 开源并拥有18.6k 的 Star。
dotnet-exec 让 C# 程序更简单
https://mp.weixin.qq.com/s/Agk3i-YLqNQfcjG4Vc-cIQ
dotnet-exec
是一个可以执行 C# 程序而不需要项目文件的命令行工具,并且你可以指定自定义的入口方法不仅仅是Main
方法。
C# 11 中的新增功能
https://mp.weixin.qq.com/s/Ga-jBE8iih7KtQVjefwlnw
我们很高兴地宣布 C# 11 已经发布!与往常一样,C# 开辟了一些全新的领域,同时推进了过去版本中一直在运行的几个主题。我们的文档页面上的 C# 11 的新增功能下有许多功能和详细信息,这些内容都得到了很好的介绍。
开发高性能ASP.NET应用
https://mp.weixin.qq.com/s/E-7y8hV006dhx7TBMrM5Gg
本文是“.NET Conf China 2022”上我的一个分享,这里更细化的分享出来。分享分为四个部分:1. 制定目标、2.设计应用、3. 正确测试、4.性能优化。
图像处理技术OpencvSharp入门
https://mp.weixin.qq.com/s/TqltBB4E-Z6w48z1K-Y6tw
在.NET下常用OpenCV进行图像处理工作,常用的.NET下的OpenCV库有Emgu CV和OpenCVSharp。今天我们就来和大家介绍一些OpenCvSharp。
工程坐标转换方法 C# 代码实现
https://mp.weixin.qq.com/s/J58yfxbtT7gspZSCEEMK_w
这里针对GPS接收的WGS84椭球的经纬度转换为地方坐标系的问题,利用C#,对工程坐标转换方法和步骤做出详细的解答。不基于任何类库和函数库,也未使用矩阵库,可以便利的将代码移植到任何语言。
主题
.NET 7 中的网络库改进 - .NET Blog
https://devblogs.microsoft.com/dotnet/dotnet-7-networking-improvements/
介绍.NET 7中与网络有关的改进的文章。该文章详细介绍了以下项目:
- 改进对连接执行失败的处理
- 为HttpHeaders读取线程安全
- HTTP/2和HTTP/3协议错误检测
- HTTP/3
- QUIC
- .NET中的的QUIC。
- API(QuicListener, QuicConnection, QuicStream)。
- 安全问题
- 协商API(Windows认证)
- 证书验证选项
- 性能
- WebSocket
- WebSockets握手响应的细节
- 外部HTTP客户端供应
- HTTP/2上的WebSockets
试用Visual Studio 2022版17.5预览版2 - Visual Studio博客
https://devblogs.microsoft.com/visualstudio/try-out-visual-studio-2022-17-5-preview-2/
Visual Studio 2022版17.5预览版已经发布。
- 一体化搜索的改进
- 编辑时的粘性滚动
- 在调试器文本可视化器中对URL编码的字符串、Base64、JWT和其他字符串进行解码
- 快速补充
- 改进的重新认证工作流程
- 将ASP.NET Core应用程序发布到Azure容器应用程序中
- ASP.NET核心项目应用程序输出到集成终端
- 各种C++改进
- 使用.config文件定制安装布局
- 能够在退出时更新
.NET 2022年12月更新 - .NET 7.0.1, .NET 6.0.12, .NET Core 3.1.32 - .NET博客
https://devblogs.microsoft.com/dotnet/december-2022-updates/
.NET 7.0.1、.NET 6.0.12和.NET Core 3.1.32已被发布。
该版本包含一个安全补丁,它修复了一个远程代码执行漏洞,该漏洞允许通过打开精心制作的XPS文件来执行代码。
这也是.NET Core 3.1的最后一个版本,它将在2022年12月13日不被支持。
.NET框架2022年12月安全和质量滚动更新 - .NET博客
2022年12月发布的.NET框架安全和累积滚动更新。
该版本包含一个安全补丁,并修复了一个远程代码执行漏洞,该漏洞允许通过打开精心制作的XPS文件执行代码。
发布IronPython 3.4.0 - IronLanguages/ironpython3
https://github.com/IronLanguages/ironpython3/releases/tag/v3.4.0
IronPython 3.4.0已经发布。
该版本支持Python 3.4语法和标准库。 它还支持一些较新版本的语法,等等。
运行时目标是.NET框架4.6.2、.NET Core 3.1和.NET 6。
它也以.NET工具的形式发布,可以通过dotnet tool install -g IronPython.Console
来安装和运行。
-IronPython 3.4.0终于正式发布了- 与.NET集成的Python语言的开源实现/从'Python 2'过渡到'Python 3' - Windows森林
多语言笔记本 - 2022年12月发布 - .NET博客
https://devblogs.microsoft.com/dotnet/polyglot-notebooks-december-2022-release/
2022年12月发布的Polyglot Notebooks(以前的.NET Interactive)。
- 升级到.NET 7
- 支持C# 11和F# 7
- SQL和KQL的改进与新的动态内核选择器
2.2.2版 - mysql-net/MySqlConnector
https://github.com/mysql-net/MySqlConnector/releases/tag/2.2.2
Async MySqlConnector 2.2.2已经发布。
该版本修复了TLS连接初始化和连接异常时对象销毁过程中的内存泄漏。
Visual Studio Code 2022年11月
https://code.visualstudio.com/updates/v1_74
Visual Studio Code 1.74(1.74.1)已经发布。
- 改善无障碍设施。
- 定制资源管理器的自动显示。
- 笔记本和差异视图中的音频提示
- 合并编辑器中的撤销/重做
- 不安全的储存库管理
- 通过JavaScript
console.profile
收集 - 从返回到定义 (JavaScript/TypeScript)
- 远程隧道
- 在Jupyter笔记本中进行 "只是我的代码 "的调试
- 开发容器中的GPU支持
此外,在1.74版发布后,1.74.1版也已发布,并对各种错误进行了修复。
用项目迁移从ASP.NET迁移到ASP.NET Core第五部分 - .NET博客
https://devblogs.microsoft.com/dotnet/migrating-from-asp-net-to-asp-net-core-part-5/
一系列关于从ASP.NET迁移到ASP.NET Core的文章,其中System.Web.Adapter 1.0现已发布。
这篇文章介绍了迁移的Visual Studio扩展和System.Web.Adapter的更新。
Visual Studio中用于ASP.NET Core项目的开发隧道 - Visual Studio博客
https://devblogs.microsoft.com/visualstudio/dev-tunnels-in-visual-studio-for-asp-net-core-projects/
一篇关于Dev tunnels(开发隧道)的介绍性文章,这是Visual Studio中ASP.NET Core项目可用的预览功能。
Dev tunnels是一种端口转发功能,允许从外部来源(如ngrok)访问本地环境。
文章介绍了最新的更新和如何使用该功能,持久性和临时性隧道的区别,工具窗口和环境变量支持。
文章、幻灯片等
未使用通用类型参数的TypeLoadException问题 | UFCPP的博客
https://ufcpp.net/blog/2022/12/unused-generic-type-parameter/
关于运行时行为问题的文章,涉及结构体的泛型和包含它们的结构。
如果struct A<T> {}
被定义为struct B { A<B> Value; }
,我们谈论的是防御性地抛出一个异常,尽管它不是递归。
在实践中尝试.NET Lambda的Native AOT | DevelopersIO
https://dev.classmethod.jp/articles/net-lambda-native-aot/
文章中对AWS Lambda支持的.NET应用的Native AOT进行了实际测试。
在文章中,除了使其发挥作用的程序外,还测量并提到了实际的启动时间。 (本地AOT较慢,等等。)
我用.NET MAUI做了一个跨平台(计划中)的备忘录应用。
https://zenn.dev/tomori_k/articles/966f34daea405a
关于在.NET MAUI中实现一个备忘录应用程序的文章。
使用NuGet 6.4中的中央软件包管理改进多个项目间的版本控制 - Shibayan Miscellaneous
https://blog.shibayan.jp/entry/20221211/1670748155
关于在NuGet 6.4中使用中央包管理来集中管理项目的包版本的文章。
文章还提到了转换器的存在和关于Dependabot的说明。
Blazor WebAssembly - 通过确保删除没有从任何地方引用的代码来减少.dll大小 - Qiita
https://qiita.com/jsakamoto/items/91c86a0f34de6e6d77b9
关于如何通过在Blazor WebAssembly中进行汇编修剪来减少文件大小的文章。
[Help wanted] 当用Playwright进行E2E测试Blazor服务器时,Playwright的第一个动作太快了,测试失败 - Qiita
https://qiita.com/jsakamoto/items/3d749a9ba4f8523b5291
关于用Playwright测试Blazor服务器时的一个问题,即在事件处理程序连接到预渲染的内容之前,Playwright以读完的方式运行。
Visual Studio生产力的新内容 - Visual Studio博客
https://devblogs.microsoft.com/visualstudio/whats-new-in-visual-studio-productivity/
关于Visual Studio生产力的新功能的文章。
- 输出窗口的时间戳
- 选择匹配
- 用鼠标滚轮进行水平滚动
- 使用声音提示跟踪代码
- 突出显示行号
扩展方法没有看到隐式类型转换 | UFCPP的博客
https://ufcpp.net/blog/2022/12/extension-resolution/
一篇解释扩展方法不能用于隐式类型转换的文章。
NET 7中新的5个MVC功能
https://andrewlock.net/5-new-mvc-features-in-dotnet-7/
文章介绍了.NET 7中ASP.NET Core MVC的5个新特性。
- Primitive binding
IParseable
,TryParse
. - MVC控制器自动猜测
[FromServices]
为依赖注入 - 使用nullable注解来猜测它是否是强制性的
- 支持MVC中的
IResult
- 定制的元数据提供者在响应中提供更好的错误名称
使用Keycloak作为Blazor WebAssembly(WASM)应用程序的身份提供者
关于如何使用Keycloak作为Blazor WebAssembly的IdP的文章。
VS2022新的DevTunnel(开发隧道)功能,便于从Azure访问本地调试环境 - Qiita
https://qiita.com/seuharuka/items/6f77983a179042b48e59
一篇介绍和使用Dev tunnels功能的文章,这是Visual Studio 2022的一个预览功能。
C#11与.NET 6.0和.NET Framework 4.8的兼容性 - Qiita
https://qiita.com/skitoy4321/items/77aff330a4ce63dd977c
文章总结了.NET 7中支持的C# 11功能在.NET 6和.NET Framework 4.8中可以使用(但不一定支持)的程度。
在GitHub行动上构建MAUI应用程序
https://zenn.dev/proudust/articles/2022-12-06-build-maui-on-gh-actions
关于GitHub Actions上支持状态和构建.NET MAUI应用程序步骤的文章。
让我们用Blazor创建一个表单,允许你动态地添加更多的输入字段。
https://zenn.dev/okazuki/articles/dynamic-items-form-in-blazor
一篇关于如何使用Blazor动态地增加和减少表单中的项目数量,以及进行验证的文章。
使用CommunityToolkit.Maui.MediaElement的背景音频流(预览),适用于Android和iOS
关于如何在Android和iOS上使用CommunityToolkit.Maui.MediaElement(预览版)进行后台流媒体音频的文章。
[调查] 在用MSBuild构建后立即运行dotnet测试,将重新构建 - Qiita
https://qiita.com/lx-sasabo/items/557ff31eee36429d229e
关于调查在用MSBuild构建后运行dotnet测试可能导致构建再次被执行的情况的文章。
该文章指出,结果因是否使用Microsoft.NET.Build.Extensions而发生变化。
用Quartz.NET调度jOB - Code Maze
https://code-maze.com/schedule-jobs-with-quartz-net/
关于如何用Quartz.NET调度Job并在后台处理的文章。
介绍Wolverine,用于有效的服务器端.NET开发
介绍使用Wolverine(一种调解器/消息总线)进行的服务器开发。
将Blazor WebAssembly(由ASP.NET Core托管)部署到Fly.io,该网站可免费使用(使用EF Core+PostgreSQL) - Qiita
https://qiita.com/nobu17/items/824c39493f7b12e94f7b
一篇关于将Blazor WebAssembly部署到fly.io并在服务器端用EF Core连接PostgreSQL等的文章。
用Figma制作的.NET MAUI UI组件 - Qiita
https://qiita.com/MAUIHighSchool/items/232e1bb3d65080f2c548
从Figma的设计到创建一个UI组件,都需要使用.NET MAUI代码。
在.NET 7中,将ASP.NET Core Identity中的2FA's Token Provider长度减少到4位而不是6位。
关于如何通过在ASP.NET Core Identity中定制2FA的令牌提供者,尝试从6位数改为4位数的文章。
CommunityToolkit.Mvvm V8介绍 - Qiita
https://qiita.com/kk-river/items/d974b02f6c4010433a9e
CommunityToolkit.Mvvm 8.0.0的一篇介绍性文章。
它介绍了属性、命令代码生成、信使等。
在.NET 8中新增ArgumentException和ArgumentOutOfRangeException帮助器
https://steven-giesel.com/blogPost/f4bc6fcc-5691-4f72-b9bb-75aeeb59230a
文章介绍了正在考虑在.NET 8中加入ArgumentException
和ArgumentOutOfRangeException
的辅助方法。
是GC的性能倒退还是其他原因?
https://maoni0.medium.com/is-the-regression-in-gc-or-something-else-38f10018dd21
关于GC中的倒退的文章。
它解释说,有些性能退步看起来像GC性能退步,但其实不是,例如当你升级.NET版本时,你可以通过使用旧的GC来检查它是否确实存在性能退步。
用ML.NET 2.0在C#中进行文本分类
https://medium.com/accessibleai/text-classification-in-c-with-ml-net-2-0-bc979dfd8ca9
关于如何使用ML.NET 2.0进行文本分类的文章。
.NET MAUI x Stripe C# 跨平台轻松信用卡支付 - Qiita
https://qiita.com/MAUIHighSchool/items/393ba93e2eade7f8c9b9
关于如何通过在.NET MAUI中嵌入Stripe SDK在您的应用程序中实现信用卡支付的文章。
C# 11中的新功能(用于编码) - Qiita
https://qiita.com/sh1ch/items/0b6add41584b5ba7f698
用代码介绍C# 11的新特性的文章。
用.NET和Swagger管理你的API的多个版本
https://medium.com/@saeedeldah/managing-multiple-versions-of-your-api-with-net and-swagger-47b4143e8bf5
关于如何使用API Explorer将ASP.NET Core Web API版本管理与Swagger结合起来的文章。
从PHP和Go中调用用C#编写的库 - Qiita
https://qiita.com/Gaku_Ishii/items/ad4abb1e0073519877d7
文章展示了如何用Native AOT将.NET代码构建为一个本地库,并从PHP和Go中调用它。
图书馆、资源库、工具等
ugai/narabemi: 快速并排的视频比较工具
https://github.com/ugai/narabemi
一个用于并排视频比较的工具。
hadashiA/VYaml: 用于C#的超快、低内存占用的YAML库,专注于.NET和Unity。
https://github.com/hadashiA/VYaml
一个高性能、节省内存的YAML库,针对.NET Standard 2.1的过渡。
davidfowl/SmartLoadBalancer: 没有粘性会话的粘性会话
https://github.com/davidfowl/SmartLoadBalancer/
为类似SignalR的东西实验性地实现了没有粘性的会话。它的工作原理是反复尝试转发请求,直到一个成功的SignalR服务器被YARP拉到。
网站、文件等
推文
Newtonsoft.Json 13.0.1有一个小的退步,没有影响到大多数人,这被误认为是不能使用的(就像对13.0.2一样,因为它打了补丁但不能使用),并被标记为脆弱版本。
https://twitter.com/jamesnk/status/1600844999783903233?s=12
深入研究
RMS v3.0 Planning · Issue #258 · microsoft/Microsoft.IO.RecyclableMemoryStream
https://github.com/microsoft/Microsoft.IO.RecyclableMemoryStream/issues/258
RecyclableMemoryStream 3.0版本的规划
版权声明
- 国内板块由 InCerry 进行整理 : https://github.com/InCerryGit/WeekRef.NET/blob/master/input_zh-CN/2022/2022-12-15.md
- 其余内容来自 Myuki WeekRef,由InCerry翻译(已获得授权) : https://github.com/mayuki/WeekRef.NET/blob/master/input/2022/2022-12-15.md
由于笔者没有那么多时间对国内的一些文章进行整理,欢迎大家为《.NET周报-国内文章》板块进行贡献,需要推广自己的文章或者框架、开源项目可以下方的项目地址提交Issue或者在我的微信公众号私信。
格式如下:
- 10~50字左右的标题
- 对应文章或项目网址访问链接
- 200字以内的简介,如果太长会影响阅读体验
https://github.com/InCerryGit/.NET-Weekly
.NET性能优化交流群
相信大家在开发中经常会遇到一些性能问题,苦于没有有效的工具去发现性能瓶颈,或者是发现瓶颈以后不知道该如何优化。之前一直有读者朋友询问有没有技术交流群,但是由于各种原因一直都没创建,现在很高兴的在这里宣布,我创建了一个专门交流.NET性能优化经验的群组,主题包括但不限于:
- 如何找到.NET性能瓶颈,如使用APM、dotnet tools等工具
- .NET框架底层原理的实现,如垃圾回收器、JIT等等
- 如何编写高性能的.NET代码,哪些地方存在性能陷阱
希望能有更多志同道合朋友加入,分享一些工作中遇到的.NET性能问题和宝贵的性能分析优化经验。由于已经达到200人,可以加我微信,我拉你进群: ls1075