.NET周报 【3月第1期 2023-03-03】
国内文章
我做的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#17.5.1
Visual Studio 2022的17.5.1版已经发布。
该版本解决了17.5(.NET SDK 7.0.200)(.NET SDK 7.0.201)中 "dotnet包 "的--输出
选项的问题,以及一些修复问题。
- [Solution-level
-output
option disabled in build-related commands - .NET | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/core/compatibility/sdk/7. 0/solution-level-output-no-longer-valid)
用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的幕后 - 第八部分
解释了如何在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工具博客
介绍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工具博客
了解如何使用动态程序分析(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支持。
版权声明
- 国内板块由 InCerry 进行整理 : https://github.com/InCerryGit/WeekRef.NET
- 其余内容来自 Myuki WeekRef,由InCerry翻译(已获得授权) : https://github.com/mayuki/WeekRef.NET
由于笔者没有那么多时间对国内的一些文章进行整理,欢迎大家为《.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,欢迎大家加入。