2021-12-17: Visual Studio 2022 v17.0.3 / 17.0.4 / for Mac Preview 4, Announcing the Plan for EF7

Published on Friday, 17 December 2021

トピックス

Visual Studio 2022 v17.0.3 / 17.0.4

https://docs.microsoft.com/ja-jp/visualstudio/releases/2022/release-notes#17030--visual-studio-2022-version-1704

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.SocketsSpan および 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 をホストする際に必要となるモジュールに関するものでこのリリースで権限昇格の脆弱性が修正されている。

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

https://dotnet.christmas/

英語圏の .NET の Advent Calendar まとめサイト。

C# Advent Calendar 2021

https://csadvent.christmas/

英語圏の C# の Advent Calendar まとめサイト。

Testing an incremental generator with snapshot testing: Creating a source generator - Part 2

https://andrewlock.net/creating-a-source-generator-part-2-testing-an-incremental-generator-with-snapshot-testing/

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 のコードでカバーする。

また、すべてのコードを共通化することでコードサイズを抑えたい場合にも役立つといったことが書かれている。

.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 リリースが必要となるとのこと。

ライブラリ、リポジトリ、ツールなど

サイト、ドキュメントなど

ツイート

.NET 6 の MVVM Toolkit がアロケーションフリーになったという話。

NLog にはアセンブリーと同じディレクトリーの NLog で始まる名前のアセンブリーを自動で読み込むという機能があり、改変なしでコードを注入するのに使用できてしまうという話(アプリケーション自体の改ざんをチェックしていても追加で読まれてしまう)。

ASP.NET のドキュメントが完全に人間による翻訳になったという話。

.NET 6 アプリケーションを Visual Studio でデバッグ中に $threadSmallObjectHeapBytes$threadUserOldHeapBytes 擬似変数というスレッドでアロケートしたバイト数を確認できるというテクニック。

Avalonia UI 向けのノードエディターのデモアプリを WebAssembly で動かせたという話。

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。