2022-10-11: Console.ReadKey improvements, Bing Ads Campaign Platform – Journey to .NET 6

Published on Tuesday, 11 October 2022

トピックス

Console.ReadKey improvements in .NET 7 - .NET Blog

https://devblogs.microsoft.com/dotnet/console-readkey-improvements-in-net-7/

Unix/Linux での Console.ReadKey の挙動をより良いものにするために .NET 7 で書き直したこととその変更の解説記事。

以前から Unix/Linux での Console.ReadKey の挙動には入力されたキーの組み合わせや修飾キーの取り扱いでバグとなる挙動がいくつも確認されてきていた。.NET 7 ではコードを新たに書き換えこの問題に対処している。

記事では書き換えの前に自動テストカバレッジを増やすために取った手法、内部でのシステムコールの呼び出し、古い実装と新しい実装について書かれている。

また .NET 6 互換の挙動に戻す runtimeconfig.json と環境変数の設定も紹介している。これらの互換動作は .NET 8 で削除される予定。

Bing Ads Campaign Platform – Journey to .NET 6 - .NET Blog

https://devblogs.microsoft.com/dotnet/bing-ads-campaign-platform-journey-to-dotnet-6/

Bing の検索広告のキャンペーンプラットフォームを .NET 6 (+ AKS) へと移行した事例紹介。

プラットフォームは秒間数千のリクエストを 100ms 未満で処理する数十の分散サービスで構築されている。コードベースでは .cspro は600を超え、500を超える NuGet パッケージの依存を持つという規模感であり、元々の実行環境は .NET Framework 4.6 と(単に"リフト"した) Windows 仮想マシンでホストする WCF による SOAP サービスだったとのこと。

記事では新しい .NET に移行する理由と移行プロセス、課題、移行の結果についてそれぞれ紹介している。

.NET に移行する理由は大きく次の5つをあげている。

  • コンテナーを使うようなクロスプラットフォーム化
  • ハイパフォーマンスや言語の機能、.NET Framework 進化の停止といった面からの .NET 開発の未来
  • 改善のイテレーションが高速であることによるイノベーションの摩擦の軽減
  • オープンソース
  • CLI ツールや SDK スタイルプロジェクト、バインディングリダイレクトの廃止のような優れたツーリング

移行プロセスはライブラリーは ".NET Framework 4.6 → .NET Framework 4.7 → .NET Standard 2.0"、アプリケーションは .NET Framework 4.6 → .NET Framework 4.7 → .NET Core 3.1 → .NET 5 → .NET 6" という順番で移行していった。.NET Framework 4.6 は .NET Standard を完全にサポートしておらず .NET Standard への移行は簡単ではなかったとのこと。

移行する中での課題とその解決について幾つか紹介している。

まず、プロジェクトは数多くの NuGet パッケージに依存しているためパッケージの更新や古いライブラリーからの置き換えが発生すること。互換性のないパッケージは再パッケージして .NET Standard をサポートした形で社内パッケージフィードに公開したり、ソースの存在しないパッケージであっても逆コンパイルしてパッチすることで .NET Standard 互換として解決した。

バインディングリダイレクトの問題は PackageReference 方式へと移行したことでダイアモンド依存問題を解決した。大量の .csproj があるため SDK スタイルに変換するツールを使用して移行を達成した。その後 .NET チームからは try-convert と呼ばれる同様のツールがリリースされた。また、パッケージ依存の複雑性を下げるためにパッケージのバージョン管理を一元化するようにしたとのこと。(記事でリンクされている Microsoft.Build.CentralPackageVersionsNuGet の Central Package Management の前身と思われる)

最後に WCF への依存について。サービスは WCF による SOAP サービスで構築されていて、利用者に公開している都合 gRPC のような物への移行はできないので最終的には WCF のサブセットである CoreWCF 作成し、移行をしたとのこと。以降の過程では .NET Framework と .NET のコードが共存することもあり、マルチターゲット化するなどの苦労はある程度あった様子。

.NET への移行の結果としてレイテンシーは大きく改善され、WCF から CoreWCF に移行した結果メモリーの使用量を40-50%ほど削減するといった大きな効果があった。

まとめとして .NET 6 への移行は大規模で痛みを伴うものではあったが価値があったと評価し、大規模なコードベースからの移行の教訓として次のポイントをあげている。

  • .NET Framework 4.7 か .NET Framework 4.8 に移行する
  • 何事を始める前にすべてのプロジェクトを SDK スタイルに変換し、PackageReference を使用するようにする
  • .NET Standard を使用して .NET Framework と .NET の両方のプロジェクトでコードを共有できるようにする
  • パッケージの一元管理を使用して新しい NuGet パッケージへの移行を簡単にする

Comparing files in Visual Studio - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/comparing-files-in-visual-studio/

Visual Studio にファイル比較機能を実装することを検討していることについて。

Visual Studio では従来任意のファイルを選択してのファイル比較を行う機能を提供して来なかったが検討を始めた。まずは File Differ という機能拡張から機能の実験開始していて記事ではその拡張の機能を紹介している。

興味がある場合はフィードバックや投票を行ってほしいとのこと。

Authentication for .NET MAUI Apps with MSAL.NET - .NET Blog

https://devblogs.microsoft.com/dotnet/authentication-in-dotnet-maui-apps-msal/

Microsoft Identity.Client 4.47.0 (MSAL.NET) で .NET MAUI をサポートしたというアナウンス。

Announcing the .NET MAUI Community Toolkit v1.3 - .NET Blog

https://devblogs.microsoft.com/dotnet/announcing-the-dotnet-maui-community-toolkit-v13/

.NET MAUI Community Toolkit v1.3 がリリースされた。

ステータスバーのスタイリング、Gravatar イメージソース、アニメーションの強化、ソースリンクの対応といったものが含まれている。

Release 11.0.0 Preview 2 · AvaloniaUI/Avalonia

https://github.com/AvaloniaUI/Avalonia/releases/tag/11.0.0-preview2

Avalonia 11.0.0 Preview 2 がリリースされた。

いくつかの安定性の向上や様々な修正などが含まれている。

Rider 2022.3 EAP 2: New UI, Improved Unit Testing, Better Dynamic Program Analysis and More. | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/10/07/rider-2022-3-eap-2/

Rider 2022.3 EAP 2 がリリースされた。

新しい IntelliJ ベース IDE の UI、Search Everywhere やツールウィンドウ、ソリューションエクスプローラーの改善、Rider 組み込みの dotMemory の Linux, macOS への対応、C# 11 への対応、ユニットテストエクスプローラーの改善、デバッガーのパフォーマンス改善、.NET MAUI サポート、IIS での起動対応、動的プログラム解析 (データベースアクセス)など。

Announcing NuGet PackageReference support for C++/CLI MSBuild projects targeting .NET Core and .NET 5 or higher - C++ Team Blog

https://devblogs.microsoft.com/cppblog/announcing-nuget-packagereference-support-for-c-cli-msbuild-projects-targeting-net-core/

Visual Studio 2022 version 17.3 以降の .NET Core または .NET 5 以降をターゲットとする C++/CLI MSBuild プロジェクトでは NuGet パッケージの参照が可能になったというアナウンス。

アーティクル、スライドなど

Xamarin.Formsライブラリを MAUIに移植した話

https://speakerdeck.com/muak/xamarin-dot-formsraiburariwo-mauiniyi-zhi-sitahua

Xamarin.Forms 向けのライブラリーを .NET MAUI に移植した話のスライド。

Xamarin.Forms と .NET MAUI の実装方法の違いや Tips 等を紹介している。

MAUI の現状と進化ポイント | ドクセル

https://www.docswell.com/s/hiro128_777/KW79X5-2022-09-30-184910

.NET MAUI の Xamarin.Forms とのアーキテクチャーの違いや、現状の各種ツーリングのサポート状態などをまとめたスライド。

.NET Annotated Monthly | October 2022 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/10/06/net-annotated-monthly-october-2022/

JetBrains による2022年10月の .NET 関連情報まとめ記事。

[C#] .NET で NamedPipe を使ってプロセス間通信 (IPC) を行う (WPFサンプル) - Qiita

https://qiita.com/kobayashi_stmn/items/7de42805eba009deebaa

.NET 6 の WPF アプリケーションで NamedPipe を使用してプロセス間通信を行う方法についての記事。

Visual Studio’s Azure Marketplace images now support Microsoft Dev Box - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/visual-studios-azure-marketplace-images-now-support-microsoft-dev-box/

Azure Marketplace の Visual Studio イメージが Microsoft Dev Box でサポートされたというアナウンス。

Adding validation to strongly typed configuration objects in .NET 6

https://andrewlock.net/adding-validation-to-strongly-typed-configuration-objects-in-dotnet-6/

.NET 6 の Microsoft.Extensions.Configuration で厳密に型指定された構成オブジェクトに検証を追加する方法についての記事。

OpenTelemetry .NETを理解する (8) 手動でのトレースの接続例: Azure Service Busを経由したアプリ間でトレースをつなげる - 銀の光と碧い空

https://tech.tanaka733.net/entry/2022/10/opentelemetry-dotnet-08

Azure Service Bus を使用したサービス間でのリクエストのトレースを繋げる方法についての記事。

Using .NET 7's Blazor Custom Elements to render dynamic content

https://jonhilton.net/blazor-custom-elements/

Custom Elements を使用して Blazor で動的な要素を構築する方法についての記事。

How we achieved 5X faster pipeline execution by removing closure allocations

https://particular.net/blog/pipeline-and-closure-allocations

NServiceBus でラムダのキャプチャー(アロケーション)を削減することでパフォーマンスを改善したという記事。

.NET MAUIだってキーボード開きたい!(Android)

https://zenn.dev/test_myname/articles/d982b67cf0615f

.NET MAUI で Android のスクリーンキーボードを表示/非表示にする方法についての記事。

Blazor WASM Custom 404 Page on GH Pages

https://dev.to/dotnet/blazor-wasm-custom-404-page-on-gh-pages-1o99

Blazor WebAssembly を GitHub Pages でホストしたときに存在しないページへのアクセス時にカスタムのエラーページを表示する方法についての記事。

From Junior to Genius: an optimization story | by Israel Lot | Oct, 2022 | ITNEXT

https://itnext.io/from-junior-to-genius-an-optimization-story-ab20afc8159d

32bit チェックサムを計算するコードを元に様々な段階を追ってチューニングしていくという記事。

記事では素朴な実装から unsafe な実装へ、トリッキーな実装やシンプルな実装、SIMD を使用した実装へと進んで最終的に85倍の高速化を行っている。

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

GitHub - xoofx/Antlr4Ast: Antlr4Ast is a .NET library that provides a parser and abstract syntax tree (AST) for ANTLR4/g4 files.

https://github.com/xoofx/Antlr4Ast

ANTLR4/g4 ファイルのパースを行って AST を作るライブラリー。

disruptor-net/Disruptor-net: Port of LMAX Disruptor to .NET

https://github.com/disruptor-net/Disruptor-net

ハイパフォーマンスなスレッド間のメッセージパッシングフレームワークライブラリー。

bchavez/Bogus: A simple fake data generator for C#, F#, and VB.NET. Based on and ported from the famed faker.js.

https://github.com/bchavez/Bogus

faker.js を移植した疑似データ生成ライブラリー。

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

ツイート

LINQPad 上で Ctrl+Shift+B を押すことで BenchmarkDotNet で即ベンチマークを取れるという統合機能が導入されるという話。

FOH (Frozen Object Heap) のいくつの部分が .NET 8 にマージされ、typeof(x) のようなものは JIT のコード生成時にライトバリアなしに直接参照を扱えるようになれるという話。

Deep Dive

Initial green thread prototype by davidwrighton · Pull Request #2002 · dotnet/runtimelab

https://github.com/dotnet/runtimelab/pull/2002

runtimelab におけるグリーンスレッドのプロトタイプ実装の PR。