トピックス
Visual Studio 2022 v17.0.3 / 17.0.4
Visual Studio 2022 の 17.0.3 と 17.0.4 がリリースされた。
17.0.3 では Unicode の双方向テキスト制御文字への対応といくつかの不具合修正が行われた。双方向テキスト制御文字対応はソースコード内に現れた場合にエディター上では文字の方向を変更する効力は持たず、プレースホルダーとして表示されるようになる。
17.0.4 では Xcode 13.2 への対応が行われている。
Visual Studio 2022 for Mac Preview 4
https://devblogs.microsoft.com/visualstudio/visual-studio-2022-for-mac-preview-4/
Visual Studio 2022 for Mac Preview 4 がリリースされた。
大きな変更点としてはエディターの各種ツールペインがドッキング可能となりソリューションエクスプローラー等の位置をドラッグアンドドロップにて移動できるようになったこと、検索結果画面がネイティブ UI になり結果のグルーピングなどができるようになったことがあげられている。その他、引き続きネイティブ UI への移行とバグ修正などが行われている。
Announcing the Plan for EF7
https://devblogs.microsoft.com/dotnet/announcing-the-plan-for-ef7/
Entity Framework Core 7 (EF Core 7 あるいは EF7) に向けたプランのアナウンス記事。
EF7 は2022年11月を目標に作業が進み .NET 7 と同時期にリリース予定。EF Core 6.1 のリリース予定はなく、EF7 は LTS ではないサポートリリースとなること、現時点では .NET 6 をターゲットにしているが .NET 7 に変わる可能性があるとのこと。
記事では EF7 のテーマとして次のようなものをあげている。
- 多くの需要のある機能
- .NET プラットフォームとエコシステム
- Entity Framework 6 (レガシー) からの移行
- パフォーマンス
需要のある機能では JSON カラムやバルクアップデート、Value Object やマップされていない型を使用する生 SQL (Dapper のような Ad-hoc クエリー)といったサポートがあがっており、プラットフォームとエコシステムでは分散トランザクション、新しい SQLServer のドライバー、トリミングや System.Linq.Expression の強化などがプランにあがっている。
.NET 6 Networking Improvements
https://devblogs.microsoft.com/dotnet/dotnet-6-networking-improvements/
.NET 6 でのネットワーク周りでの改善についての記事。記事では下記の項目について細かく解説している。
- HTTP
- HTTP/2 Window Scaling
- HTTP/3 & QUIC
- HTTP リトライロジック
- SOCKS プロキシーサポート
- WinHTTP
- その他
- コネクションプールの改善
- 検証なしのヘッダー列挙
- HPack デコードの最適化
- ZLibStream の導入
- Cookie の列挙
- ソケット
- Windows でのポート範囲自動再利用のサポート
- IPv6 グローバル無効化オプション
System.Net.Sockets
のSpan
および Task ベースのオーバーロードのサポート
- セキュリティ
- 遅延クライアントネゴシエーション
- Windows でのユーザー偽装の改善
- 診断
- Activity のヘッダー伝搬のコントロール
- URI
- URI の正規化の無効化
.NET December 2021 Updates – 6.0.1, 5.0.13 and 3.1.22
https://devblogs.microsoft.com/dotnet/december-2021-updates/
2021年12月の .NET の更新(.NET 6.0.1, 5.0.13, .NET Core 3.1.22)がリリースされた。
それぞれいくつかのバグ修正やバックポートが含まれるほか、ASP.NET Core のセキュリティー修正が含まれている。
ASP.NET Core のセキュリティー修正は ASP.NET Core Module (ANCM) と呼ばれる IIS で ASP.NET Core をホストする際に必要となるモジュールに関するものでこのリリースで権限昇格の脆弱性が修正されている。
- Microsoft Security Advisory CVE-2021-43877 | ASP.NET Core Elevation of privilege Vulnerability · Issue #206 · dotnet/announcements
- December 2021 .NET Updates · Issue #205 · dotnet/announcements
Orleans Announcement · Issue #7423 · dotnet/orleans
https://github.com/dotnet/orleans/issues/7423
Orleans を .NET チームに移管するというアナウンス。
これに伴い Issue の管理やリリースといったプロセスを dotnet/aspnetcore と同様の形にするとのこと。
Release Release v1.43.0 · grpc/grpc
https://github.com/grpc/grpc/releases/tag/v1.43.0
gRPC 1.43.0 がリリースされた。
C# に関連する変更として Grpc.Core.Api に null 許容参照型アノテーションが適用された。このパッケージは C-core と .NET 実装 (grpc-dotnet) の両方で使用される API サーフェースを定義したものであり、どちらの実装を使用する場合でも恩恵を受ける。NuGet パッケージでは 2.43.0 となるが現時点ではまだリリースされていないようなので注意。
アーティクル、スライドなど
.NET Advent Calendar
英語圏の .NET の Advent Calendar まとめサイト。
C# Advent Calendar 2021
英語圏の C# の Advent Calendar まとめサイト。
Testing an incremental generator with snapshot testing: Creating a source generator - Part 2
Source Generator を Verify というライブラリーを使用してスナップショットテストを行う方法についての記事。
Blazor WebAssemblyで2GBの壁を超え4GBへ - Qiita
https://qiita.com/yamachu/items/a357ab72f76afa2802b6
Blazor WebAssembly で 4GB のメモリーを確保するにはという記事。
記事では Native Dependency を駆使して Emscripten にビルドフラグを渡すことで 2GB の壁を超えるといった手法を紹介している。
.NET 6のトップレベルステートメントを使ったコンソールプロジェクトで、EFCoreのマイグレーションはなぜ動くのか - Qiita
https://qiita.com/karuakun/items/d503fb1c9579eb27de18
特定のメソッドがないと動かなかった EF Core のマイグレーションが EF Core 6 からはトップレベルステートメントを含めて動くようになった仕組みについての記事。
.NET History Timeline. --- It's not finished yet, so if you find...
https://www.reddit.com/r/dotnet/comments/rcg391/net_history_timeline_its_not_finished_yet_so_if/
.NET の年表(タイムライン)
Digging into the .NET Dictionary implementation…
https://ayende.com/blog/195651-B/digging-into-the-net-dictionary-implementation
Dictionary の内部実装についての記事。_buckets
と _entries
のフィールドがあることなど。
.NET6のFile IO改善はLinux&macでも改善されているか検証してみた - Qiita
https://qiita.com/KuriharaJun/items/5bab044c4b02dec2da3a
.NET 6 でのファイルの読み書きに関する改善を Linux と macOS および Windows で比較、検証した記事。
記事ではすべてのケースで .NET 6 で結果が改善されていることが示されている。
Xamarin.Froms プロジェクトを .NET6 へアップグレードする
https://zenn.dev/proudust/articles/2021-12-12-xamarin-upgrade-to-dotnet6
従来の Xamarin の Xamarin.Forms のプロジェクトを .NET 6 の Xamarin.Forms へと移行する手順をまとめた記事。
Burstでポータブルかつ確実にSIMD化を行うにはどうすればいいのか - Qiita
https://qiita.com/Trapezoid/items/461c058a0feadb7ccefe
Unity の Burst Compiler で SIMD 化をコンパイラー任せではなく、コード上でコントロールすることで確実に SIMD 化する方法についての記事。
【C#】デリゲートのコンパイル結果
https://zenn.dev/naminodarie/articles/5acc9f03f10296
デリゲートの記述方法別での実際にコンパイルされたときの形を調べている記事。
TagWithとTagWithCallSiteでSQLを発行したメソッドを特定する - Qiita
https://qiita.com/karuakun/items/6d7280d7928af06cb1bc
Entify Framework Core のクエリーに調査目的などでタグをつけるための TagWith
と EF Core 6 で追加された呼び出し元名をタグとしてつける TagWithCallSite
についての解説記事。
20 New APIs in .NET 6
https://blog.okyrylchuk.dev/20-new-apis-in-net-6
.NET 6 で追加された API を20個、簡単に紹介している記事。
Windows Terminal as your Default Command Line Experience
https://devblogs.microsoft.com/commandline/windows-terminal-as-your-default-command-line-experience/
Windows Terminal をデフォルトのコマンドライン環境とすることについての記事。
将来の Windows 11 のバージョンでは Windows Terminal がデフォルトになる予定であるとのこと。
Machine Learning in Xamarin.Forms with ONNX Runtime
https://devblogs.microsoft.com/xamarin/machine-learning-in-xamarin-forms-with-onnx-runtime/
Xamarin.Forms と ONNX Runtime でモバイルで機械学習を使用するという記事。
記事では既にある画像に対して画像の分類をかけるといった処理を行うサンプルで解説している。
What’s new in .NET Productivity with Visual Studio 2022
https://devblogs.microsoft.com/visualstudio/whats-new-in-net-productivity-with-visual-studio-2022/
Visual Studio 2022 の .NET の生産性に関する新機能について紹介している記事。
- Source Link ナビゲーション
- Stack Trace Explorer
- EditorConfig UI での命名規則設定
- ソリューションエクスプローラーから名前空間の同期
- await の IntelliSense 補完
- 新しいコードフィックスとリファクタリング
なお Stack Trace Explorer は現時点ではリリースされておらず、17.1 Preview 2 以降で提供されるとのこと。
C#のsealedメソッドをオーバーライドする
https://www.infoq.com/jp/articles/overriding-sealed-methods-c-sharp/
メタデータを書き換えることでメソッドを置き換える黒魔術を解説している記事(日本語訳)。
Planned work for System.Text.RegularExpressions for 7.0.0 · Issue #62758 · dotnet/runtime
https://github.com/dotnet/runtime/issues/62758
.NET 7 で予定されている正規表現関連の改修タスクの Issue。
.NET 6 の C# 10 を今すぐ REPL で試す - Qiita
https://qiita.com/advanceboy/items/03f347cd773934fda8d5
Binder (Jupyter Notebook のホスト) と dotnet/interactive リポジトリを使用して、ブラウザー上でインスタントに .NET Interactive を起動して .NET を試す方法についての記事。
コンテナ環境でのデータベースマイグレーション - Qiita
https://qiita.com/karuakun/items/6dc22d2cdbbb43c024e7
コンテナー環境での Entity Framework Core のマイグレーションの実行についての記事。
記事ではスクリプトを出力する方法、dotnet ef database update
を使用できるコンテナーイメージを作る方法、EF Core 6 から提供されているマイグレーションバンドルを使用する方法が紹介されている。
Interpreting async code in CPU traces
https://www.poppastring.com/blog/interpreting-async-code-in-cpu-traces
プロファイラーで非同期コードのパフォーマンスを確認する際に役立つ機能についての記事。
MAUIのコントロールをカスタマイズする方法 - Qiita
https://qiita.com/f-miyu/items/ca02ea3bcf7e88f6eeb7
MAUI でコントロールをカスタマイズする方法についての記事。
.NET汎用ホストでWPFを動かしてDIしたりHTTPリクエストを受け付けたりした話 - Qiita
https://qiita.com/miswil/items/3b9bd7e40209f1c5dce3
WPF プロジェクトで Microsoft.Extensions.Hosting を使用して DI や Web アプリケーションをホストする方法についての記事。
【C# 11 候補】 {} 中の改行 | ++C++; // 未確認飛行 C ブログ
https://ufcpp.net/blog/2021/12/newlines-in-interpolated-string/
文字列補完式の {}
の中でのコード的な改行の取り扱いが C# 11 で変更される予定があるという記事。
Feature preview: IL2CPP Full Generic Sharing in Unity 2022.1 beta | Unity Blog
https://blog.unity.com/technology/feature-preview-il2cpp-full-generic-sharing-in-unity-20221-beta
Unity 2022.1 beta の IL2CPP (AOT) でジェネリクスの型パラメーターに値型を取る物に対するコード生成を一つのコードでカバーできる仕組みを導入したという記事。
従来ジェネリクスの型パラメーターに値型を取る場合はその型固有のコードを生成する必要があり、何らかの理由で解析から漏れると実行エラーとなっていたがそれをカバーできるフォールバック的なコードを生成するようになった。
記事では Manager.SendMessage<T>
と IManager.SendMessage<T>
のようなものがあり、インターフェースを経由して呼び出した場合(IManager.SendMessage<AnyEnum>(...)
)、Manager.SendMessage<AnyEnum>
をコンパイル時には検出できずコード生成が不完全となり実行時にエラーになるという例が挙げられている。このようなケースを Full Generic Sharing のコードでカバーする。
また、すべてのコードを共通化することでコードサイズを抑えたい場合にも役立つといったことが書かれている。
We've seen 15% throughput degradation for generic heavy code (Entity Framework) with a similar tech in .NET Native. I call this code "Universal Shitty Code". One really wants to run such code as little as possible. https://t.co/2ULALO4uU3
— Michal Strehovský (@MStrehovsky) December 15, 2021
.NET Native (UWP の .NET の AOT コンパイラー) でも同じような実装があり、このパスを通ることでパフォーマンスが低下するといったことがあったという話。
スレッドでは IL2CPP の記事を書いた Josh Peterson さんもこの共有コードを通る場合はパフォーマンスのオーバーヘッドがあるが、殆どのプロジェクトではこのパスを通らないので影響はほとんどないとのこと。もしパフォーマンスが重要なコードではこのパスを通らないようにしたほうがよいとしている。
Parallel.ForEachAsync Deep Dive
https://www.gregbair.dev/posts/parallel-foreachasync/
.NET 6 で導入された Parallel.ForEachAsync
の内部実装についての記事。
System.Text.Jsonソースジェネレーターパフォーマンス調査 - Qiita
https://qiita.com/skitoy4321/items/727ae10a2bc5a54404d5
.NET 6 で導入された System.Text.Json の Source Generator によるコード生成を使用した場合のパフォーマンスについての記事。
記事ではシリアライズとデシリアライズのパフォーマンスを比較している。
We’re upgrading Visual Studio’s feedback!
https://devblogs.microsoft.com/visualstudio/were-upgrading-visual-studios-feedback/
Visual Studio のフィードバックのシステムをアップグレードしているという記事。
このアップグレードの影響で Visual Studio からフィードバックするには 16.7 以降または LTSC リリースが必要となるとのこと。
ライブラリ、リポジトリ、ツールなど
サイト、ドキュメントなど
ツイート
Happy to announce that with the latest changes merged, both messenger types in the MVVM Toolkit are now completely allocation free on .NET 6! They are also both by far the fastest messenger/event-aggregator types across any other MVVM library that I could find! 🚀#csharp #dotnet pic.twitter.com/KmgvDAc6uL
— Sergio Pedri (@SergioPedri) December 10, 2021
.NET 6 の MVVM Toolkit がアロケーションフリーになったという話。
Everybody is talking about log4j’s RCE, meanwhile @sailro is using a NLog feature that will automatically load and execute binaries to inject his own code in Escape from Tarkov, the README is worth a read: https://t.co/qSqhBc3Dsd
— Jb Evain (@jbevain) December 10, 2021
NLog にはアセンブリーと同じディレクトリーの NLog で始まる名前のアセンブリーを自動で読み込むという機能があり、改変なしでコードを注入するのに使用できてしまうという話(アプリケーション自体の改ざんをチェックしていても追加で読まれてしまう)。
【完全に人間翻訳されたドキュメントのお知らせ|ASP .NET 】
— Microsoft Tech (@msdevjp) December 9, 2021
皆さまからのフィードバックをもとに、一部機械翻訳だった「ASP .NET ドキュメント」が、完全に人間による翻訳になりました!
自己学習の際にはぜひご活用ください。
▼ドキュメントを読むhttps://t.co/tNhqwBXBpj#MSDocsJP
ASP.NET のドキュメントが完全に人間による翻訳になったという話。
With .NET 6 apps, you can now get the # of bytes each thread has allocated so far using the new debugger pseudovariables “$threadSmallObjectHeapBytes and $threadUserOldHeapBytes”#vsdebuggertip #vstip #VS2022 pic.twitter.com/Po0VAIfU5f
— Visual Studio Debugger (@VS_Debugger) December 14, 2021
.NET 6 アプリケーションを Visual Studio でデバッグ中に $threadSmallObjectHeapBytes
と $threadUserOldHeapBytes
擬似変数というスレッドでアロケートしたバイト数を確認できるというテクニック。
Webassembly application written using C#/XAML .NET 6 using #AvaloniaUI framework running on the web - total download size 8.4 MB ! pic.twitter.com/78jC6hDz2w
— Wiesław Šoltés (@wieslawsoltes) December 13, 2021
Avalonia UI 向けのノードエディターのデモアプリを WebAssembly で動かせたという話。
2/2 The most important question is - will it run DOOM as a .NET app? Yes it will. Source in this repo: https://t.co/lm1R6l5uqW pic.twitter.com/GVM7qALgss
— Michal Strehovský (@MStrehovsky) December 17, 2021
Microsoft Visual C++ のコンパイラー cl
コマンドでは /clr
オプションをつけることで C++ のコードを C++/CLI としてコンパイルできるが、隠しオプションを使うことで C++ の代わりに C 言語のコードを .NET アプリケーションとしてコンパイルできるので DOOM を動かしたという話。
Deep Dive
.NET number values such as positive and negative infinity cannot be written as valid JSON. · Issue #48926 · dotnet/runtime
https://github.com/dotnet/runtime/issues/48926
System.Text.Json で double.PositiveInfinity
/double.NegativeInfinity
をシリアライズしようとすると例外がでるという Issue。
JSON の仕様上表現できないためそのような挙動となっている。JsonNumberHandling.AllowNamedFloatingPointLiterals
をオプションに渡すことで回避できるがその場合は単に文字列として出力される。
Add Array.GetMaxLength<T> by huoyaoyuan · Pull Request #43301 · dotnet/runtime
https://github.com/dotnet/runtime/pull/43301
Array の最大長を取得するメソッドを追加する PR。
元々バイト配列は 0X7FFFFFC7
、それ以外は 0X7FEFFFFF
が最大長だったので一貫した最大値を取る方法がほしいという話だった。ところが将来的にパフォーマンスに有利に働かせられるのではとその制限を残してきていたが、そういったこともなさそうなので 0X7FFFFFC7
に統一されることになり、メソッドではなく Array.MaxLength
として定数で公開されることになった。
Reimplement the concurrency limiter middleware to use the new abstractions & implementations by Tratcher · Pull Request #39040 · dotnet/aspnetcore
https://github.com/dotnet/aspnetcore/pull/39040
ASP.NET Core の Concurrency Limiter ミドルウェアを新しい Rate Limiting API に置き換えるという PR。
Add ConstantExpectedAttribute by wzchua · Pull Request #62436 · dotnet/runtime
https://github.com/dotnet/runtime/pull/62436
メソッドの引数が受け取る値が定数であることを期待することを明示するマーカー属性を追加する PR。
これは Intrisics なメソッドの場合、定数が渡っていることを期待している場合があるので Analzyer などで早期に間違いを発見したいというところから来ている。
Strange RegEx performance in .NET 5 · Issue #62902 · dotnet/runtime
https://github.com/dotnet/runtime/issues/62902
正規表現のパフォーマンスが .NET Core 3.1, .NET 5, .NET 6 で比較すると .NET 5 だけ良いので変ではという Issue。
これは .NET 5 で最適化が入ったが特定のパターンで期待した結果とならないのでロールバックしたという話(つまり .NET 5 の正規表現だけ結果が異なる場合がある)。
Report error if 'record struct' constructor calls default parameterless constructor by cston · Pull Request #58339 · dotnet/roslyn
https://github.com/dotnet/roslyn/pull/58339
record struct
にコンストラクターを定義した場合 this
でコンストラクターを呼び出すようにエラーが出るが、this()
とすると InvalidProgramException
がスローされてしまう問題を修正する PR。