トピックス
The ECMA C# draft standard and the Microsoft C# spec have finally converged.
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/readme
ECMA 標準の C# のドラフトが Microsoft の C# 仕様と収束する形になり、docs.microsoft.com 上で閲覧できるようになった。現在ドラフトとして進行しているバージョンは C# 6 となっている。
The ECMA C# draft standard and the Microsoft C# spec have finally converged. The ECMA draft for C# 6 is now live on @docsmsft Check it out here: https://t.co/VufFlgyRlD
— Bill Wagner (@billwagner) January 12, 2022
.NET Framework January 2022 Security and Quality Rollup Updates - .NET Blog
.NET Framework の2022年1月のセキュリティー修正と品質ロールアップアップデートがリリースされた。
このリリースでは DoS 脆弱性に対するセキュリティー修正といくつかの品質向上の不具合修正が含まれている。
State of the Windows Forms Designer for .NET Applications - .NET Blog
https://devblogs.microsoft.com/dotnet/state-of-the-windows-forms-designer-for-net-applications/
Visual Studio の .NET (Core 3.1, 5, 6) 向け Windows Forms アプリケーションのためのデザイナーの現状についての記事。
現状、.NET Framework の Windows Forms 向けのデザイナーと .NET の Windows Forms 向けのデザイナーでは機能に差があり、その差を埋める作業が続いている。
記事では何故新しいデザイナーが必要となったのか、新しいデザイナーは Out-of-Process モデルで動作する上でどのようにして Visual Studio と協調動作しているのかといったことが説明されている。その上でこれから対応予定の機能についても触れている。
Fair Trade Software License | Duende Software Blog
https://blog.duendesoftware.com/posts/20220111_fair_trade
IdentityServer の Community Edition の機能制限がなくなり Enterprise Edition 相当となった。
多くのプロジェクトで採用されている認証フレームワークの IdentityServer は2年前にフリーソフトウェアから商用ライセンスモデルへと移行し、その後小規模収益企業や個人向けに以前のフリーソフトウェア版とほぼ同レベルの機能を持つ Community Edition をリリースした。今後 IdentityServer v6 以降の Community Edition が Enterprise Edition 相当の機能を提供するようになる。
Dunde Software ではこの大きな収益を持つ企業や個人には支払いを求め、小規模な企業や個人は低価格または無料で始められるライセンスモデルをフェアトレードソフトウェアライセンスと呼んでいる。
アーティクル、スライドなど
【Visual Studio】 Naming Style 設定 | ++C++; // 未確認飛行 C ブログ
https://ufcpp.net/blog/2022/1/naming-style/
フィールドの命名規則として _
をつけるようなスタイルを EditorConfig に記述する方法についての記事。
WPF から Windows App SDK に移行を試してみた
https://zenn.dev/okazuki/articles/migrate-to-windowsappsdk-from-wpf
.NET Core 3.0 の WPF 製サンプルアプリで Windows App SDK への移行を行ってみたという記事。依存ライブラリーの代替や苦労した点について書かれている。
Feature Management using Consul KV store in ASP.Net core
https://dev.to/niteshsinghal85/feature-management-using-consul-kv-store-in-aspnet-core-5a1d
ASP.NET Core アプリから Consul KV に保存された設定を取得してフィーチャー切り替えを行うという記事。
【C# 11 候補】defaultable value type | ++C++; // 未確認飛行 C ブログ
https://ufcpp.net/blog/2022/1/defaultable/
参照型で null を受け入れる null 許容型があるのと同様に、値型の default を受け入れる default 許容型を用意してフロー解析によってガードするという C# 11 候補の機能についての記事。
ImmutableArray 構造体のように default のままでは困る型を取り扱いに使われる。
[C#]CollectionsMarshal の解説
https://zenn.dev/naminodarie/articles/a950920fe7d1a5
.NET 5 で導入された CollectionsMarshal クラスのメソッドについての記事。.NET 6 で追加されたメソッドについても触れている。
Bringing Code Cleanup on Save To Visual Studio 2022 17.1 Preview 2
Visual Studio 2022 17.1 Preview 2 で導入された保存時のコードフォーマットの設定とその動作の様子についての記事。
MemberNotNull (値型) 判定 | ++C++; // 未確認飛行 C ブログ
https://ufcpp.net/blog/2022/1/member-not-null/
MemberNotNull
属性が非 null であるはずの値型のフィールドやプロパティーに対してもフロー解析を行っているということについての記事。
Diagnostics on Kubernetes: Obtaining a Memory Dump
https://dev.to/damonjames/diagnostics-on-kubernetes-obtaining-a-memory-dump-kgb
Kubernetes の Pod で動いている .NET アプリケーションのメモリーダンプを取得することについての記事。
記事では dotnet-gcdump ツールを使用して、Pod の中でダンプを取得した後ローカルにコピーするという方法が紹介されている。
Exploring hosting startup assemblies in ASP.NET Core
ASP.NET Core アプリケーション起動時に自動でアセンブリを読み込むホスティングスタートアップアセンブリの仕組みを使用して Application Insights のようにロギングの仕組みを自動で読み込ませる方法についての記事。
.NET Data Frameworks Biweekly Updates (2022) · Issue #27185 · dotnet/efcore
https://github.com/dotnet/efcore/issues/27185
Entity Framework などデータフレームワークの隔週アップデートの情報の2022年1月13日号。
EF Core 7 のプランがあがっていることや EF Core 6.0.2 のリリースが来月を予定していることなどが書かれている。
Write a URL Shortener in 26 Lines of Code with .NET Minimal APIs
ASP.NET Core の Minimal API で26行で短縮 URL サービスのサーバーを作ってみるという記事。
Performance analysis of EF/EF Core read operation with or without AsNoTracking() using Benchmark.net
EF/EF Core で AsNoTracking した際の読み取りパフォーマンスについての記事。
ベンチマーク結果としては AsNoTracking しているケースでパフォーマンスがよく、読み取り専用であれば価値はあるとしている。
ライブラリ、リポジトリ、ツールなど
C# to Dart Converter
C# のクラス定義から Dart の JSON シリアライズ/デシリアライズのコードに変換するツール。
Cysharp/WebSerializer: Convert Object into QueryString/FormUrlEncodedContent for C# HttpClient REST Request.
https://github.com/Cysharp/WebSerializer/
HTTP のリクエストに使用するクエリーストリング(?q=foo&bar=baz
)をクラスなどから効率よく組み立てる仕組みを提供するライブラリー。文字列だけでなく HttpClient で使用できる HttpContent を生成する機能も提供している。
サイト、ドキュメントなど
ツイート
How to read and decode IL Code from a method in C#:#dotnet pic.twitter.com/uEd9fniBJB
— Bartosz Adamczewski (@badamczewski01) January 9, 2022
リフレクションでメソッドの IL を取り出して読みだす方法について。
The Thread Pool is fully re-written in managed code in .net 6 with a really nice new feature: it can now detect a famous "sync over async" anti-pattern when a thread pool is blocked on Task.Wait or Task.GetAwaiter().GetResult() to add more threads quicker to unblock the app. pic.twitter.com/o8rJxKlaoJ
— Sergey Teplyakov (@STeplyakov) January 11, 2022
.NET 6 で Thread Pool がマネージドコードで書き直され、"sync over async" と呼ばれる非同期を同期待機するアンチパターンによるブロッキングを検出して新しいスレッドを立ち上げるようになった。("sync over async" は待機スレッドがブロック状態となり、二つのスレッドがないと完了できなくなるためスレッドプール枯渇の原因となる)
gRPC on .NET reached #1 in the latest benchmark results! 🚀 (by 13 whole req/s 😅)
— James Newton-King ♔ (@JamesNK) January 13, 2022
Enabling .NET 6's profile-guided optimization pushed .NET over the top.https://t.co/60yFyVmzpw pic.twitter.com/v9gluHUgdG
.NET の gRPC 実装が最新のベンチマークで1位を取ったという話。
Building popular software is fun. pic.twitter.com/Okw2LhSQYa
— Eric Lawrence 🎻 (@ericlaw) January 13, 2022
Microsoft Edge のウィンドウタイトルの "Microsoft Edge" 部分にはゼロ幅スペースが含まれているという話。そのような奇妙なことをしている理由はタッチパッドのドライバーが Microsoft Edge をウィンドウタイトルで検出して EdgeHTML 版だと思って処理するものがあったため(つまり互換性のために引っかからないようにした)とのこと。
After adding #ARM64 support to @ImageMagick on @Windows I promised that this would also be added to MagickNET and that was just completed! 🤩🤩🤩📣📣🤩🤩🤩. A new release with support for #ARM64 on @Windows will be published soon. pic.twitter.com/SK5YNWtJQT
— 🧙♂️Dirk Lemstra (@MagickNET) January 13, 2022
ImageMagick に ARM64 版 Windows の対応が入ったのち、Magick.NET も対応を行うとしていたがその準備ができたので近く Magick.NET の ARM64 向け対応をリリースするという話。
Long time coming but in C# 11 method group to delegate conversions will be cached just as lambdas are today https://t.co/0OnpClKfU4
— Jared Parsons (@jaredpar) January 13, 2022
メソッドグループのデリゲート変換のキャッシュを行うという PR がマージされ、C# 11 のコンパイラーに入るという話。
Deep Dive
[Proposal]: [String.SplitAsSpan] · Issue #63497 · dotnet/runtime
https://github.com/dotnet/runtime/issues/63497
文字列の Split
に ReadOnlySpan<char>
で返すものが欲しいという提案 Issue。
.NET Community Toolkit に Tokenize 拡張メソッドがあるのでそれが使える、行単位であれば .NET 6 には ReadOnlySpan<char>.EnumerateLines()
というメソッドがあるといったコメントがついている。
- Add 'split' support for ReadOnlySpanchar similar to string · Issue #934 · dotnet/runtime
- dotnet/StringExtensions.cs at main · CommunityToolkit/dotnet
Enable GC regions by default by mangod9 · Pull Request #59283 · dotnet/runtime
https://github.com/dotnet/runtime/pull/59283
GC のメモリー管理をセグメントからリージョンに変更したものをデフォルトにするという PR。一度マージされたがその後 NativeAOT で問題があり Revert された模様。
- Epic: GC Regions Support · Issue #43844 · dotnet/runtime
- Segfault in gc_heap::get_region_plan_gen_num for a frozen object · Issue #63778 · dotnet/runtime
Added support for binding the raw request body by davidfowl · Pull Request #39388 · dotnet/aspnetcore
https://github.com/dotnet/aspnetcore/pull/39388
Minimal API のバインディングに PipeReader, Stream, ReadOnlySequence といったボディーを直接読み取れるようにするものを追加するという PR。
Razor Support (Results.Page()
, etc.) for Minimal Endpoints · Issue #39431 · dotnet/aspnetcore
https://github.com/dotnet/aspnetcore/issues/39431
Minimal API の戻り値として Razor ページを返せるようにしたいという Issue。