2021-11-19: Windows App SDK 1.0, Azure Active Directory's gateway is on .NET 6.0

Published on Friday, 19 November 2021

Windows App SDK 1.0 がリリースされました。

WinUI 3 も含まれており、モダンな Windows アプリケーションを作るための新しい SDK の大きなマイルストーンの一つに到達したという感じでしょうか。

次期バージョンではマルチウィンドウや通知、Self-contained XCopy 配置などが計画されているとのことです。


Azure Active Directory のゲートウェイを .NET 6 に移行した話が公開されています。

9月頃から .NET 5 から .NET 6 に移行して、CPU 使用率を 30% 削減できたそうです。.NET 6 になったことでサーバーも IIS でのホストから HTTP.sys を利用する形に移行し、アプリケーションのパフォーマンスの向上のために Dynamic PGO を有効にして高い効果を得られたそうです。

Dynamic PGO はワークロードや計測結果次第ではありますが、アプリケーションのパフォーマンス向上に高い効果がある可能性があるので、起動直後の速度がある程度許容できるサーバーアプリケーションなどでは積極的に試してみる価値はあるかもしれません。

トピックス

Release 1.0.0 · microsoft/WindowsAppSDK · GitHub

https://github.com/microsoft/WindowsAppSDK/releases/tag/v1.0

Windows App SDK 1.0 がリリースされた。このリリースには WinUI 3 も含まれている。

  • WinUI 3
    • 新コントロールの追加とビジュアルの更新
    • パッケージ化テンプレート
    • Windows 10 Version 1809 以降での非パッケージデスクトップアプリ (msix を使用しないデプロイ) のサポート
    • Windows 10 Version 1809 のサポート
    • Visual Studio 2022 でのホットリロードとライブビジュアルツリーのサポート
  • ウィンドウ
    • Win32, WPF, Windows Forms で利用可能なウィンドウを扱う高レベル API AppWindow の追加
  • 入力
    • Pointer API: XAML の入力 API でポインターイベント情報を取得をサポートする API
    • InputPointerSource API: XAML の SwapChainPanel でポインターと入力イベントのハンドリングを提供する API
    • Cursor API: カーソルのビットマップの変更を可能にする API
    • GestureRecognizer API: ドラッグやホールド、クリックといったジェスチャーを取り扱う API
  • アプリのライフサイクル
  • DWriteCore
  • MRT Core
  • デプロイ
    • WindowsPackageType プロパティを指定することで Windows App SDK の初期化を行う仕組み
    • 非パッケージアプリ向けの Windows App SDK インストーラーの MSI や既存セットアップへの統合
    • .NET の非パッケージアプリ向けのブートストラップ API のラッパー
    • パッケージアプリ向けのインストールの検証を行うデプロイメント API

Azure Active Directory's gateway is on .NET 6.0!

https://devblogs.microsoft.com/dotnet/azure-active-directorys-gateway-is-on-net-6-0/

Azure Active Directory のゲートウェイサービスを .NET 5 から .NET 6 へと移行した話。

Azure AD ゲートウェイは Azure Active Directory の表に立つリバースプロキシーサービスで、TLS終端やフェイルオーバー、ルーティングなどを行い、一日約1,850億リクエストを処理している。記事では2021年の9月にサービスのランタイムを .NET 5 から .NET 6 へと移行した結果の効果とその際どのようなことを行ったのか、学びのあったポイントなどに触れている。

.NET 6 へと移行した効果としては CPU の使用率が33%低下し、アプリケーションの効率(Request-per-second / CPU 使用率で求めた値)は50%向上した。

.NET 6 へアップグレードする上で行ったことは大きく次の2点。

  • IIS から HTTP.sys への移行 (.NET 6 になったことで対応できた)
  • Dynamic PGO の有効化 (.NET 6 からの新機能)

IIS から HTTP.sys への移行は、以前 .NET Framework から .NET Core 3.1 へ移行した際に IIS を選択していたが .NET 6 への移行で HTTP.sys の利用を選択した。Kestrel は必要な TLS の機能が不足していたため選択しなかったとのこと。

HTTP.sys への移行により受けた恩恵は下記の通り。

  • 27% のアプリケーションの効率の向上
  • 決定論的キューイングモデル
    • HTTP.sys と IIS でそれぞれリクエストキューを持っていてパフォーマンスの問題が発生することがあったが、IIS がなくなったことで HTTP.sys のキューだけとなった
  • デプロイとスケーリングの体験の向上
    • サイトを展開する前の IIS と ANCM (ASP.NET Core Module) のインストールと構成が不要となり、TLS の設定も HTTP.sys のものだけとなり簡潔になった

その他移行時の変更点として、TLS の再ネゴシエーション (クライアント証明書)や IIS での TLS 設定の HTTP.sys へのマッピング、non-ASCII なヘッダーを受け入れる設定、モニタリングなどにふれている。

Dynamic PGO (profile-guided optimization) の有効については次のような設定を行ったとのこと。

  • set DOTNET_TieredPGO=1
    • Tier0 コンパイル結果の動作で収集された情報を元に Tier1 コンパイルを行う設定。アプリケーションの効率はプレーンな .NET 6 と比較して 8.18% 向上
  • set DOTNET_TC_QuickJitForLoops=1
    • ループを含むメソッドでの階層化コンパイルを有効にする設定。アプリケーションの効率はプレーンな .NET 6 と比較して 10.2% 向上
  • set DOTNET_ReadyToRun=0
    • ReadyToRun (AOT) を無効にする設定。上記二つと合わせてアプリケーションの効率はプレーンな .NET 6 と比較して 13.23% 向上
    • .NET のコアライブラリーはデフォルトで ReadyToRun が有効な形で出荷されている(AOT 済みで起動パフォーマンスが良い形となっている)。これを無効化することで Dynamic PGO が必要とする Tier0 プロファイリングを可能とする

その他の学びとして次のようなものを挙げている。

  • SocketsHttpHandler の .NET 6 での変更に関してのいくつかの問題
    • .NET チームとしてワークアラウンドを見つけたり、改善したりしている
    • .NET 6 では新規接続の失敗時に複数のリクエストが影響を受ける。これは ConnectTimeout の値を調整することで対応できる可能性がある
    • RST パケットで失敗したリクエストは自動でリトライされなくなり、"An existing connection was forcibly closed by remote host" が発生しやすくなっていた。ワークアラウンドとして HttpClient での再試行や PooledConnectionIdleTimeout を設定することでの RST パケットを減らすといったものがある
  • HTTP.sys サーバーでの挙動の変更や問題の修正など

Visual Studio 2022 version 17.0.1

https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes#17.0.1.0

Visual Studio 2022 17.0.1 がリリースされた。

バッチビルドや Xamarin.Forms プロジェクトでの XAML ホットリロードでのクラッシュの修正、プロファイラーの不具合の修正など。

What's new in Windows Forms in .NET 6.0

https://devblogs.microsoft.com/dotnet/whats-new-in-windows-forms-in-net-6-0/

.NET 6 における Windows Forms の改善点などをまとめた記事。

  • アクセシビリティ
    • UIA のサポートするコントロールの追加や読み上げの改善、いくつかのコントロールのコントラスト改善など
  • アプリケーションブートストラップ
    • アプリケーションワイドなデフォルトフォント設定を行う Application.SetDefaultFont API の追加
    • アプリケーションの初期設定を行う ApplicationConfiguration.Initialize をコード生成するように。MSBuild のプロパティーを介して設定可能
  • テンプレートの更新
    • global using などが使用されるようになり、より簡素なエントリーポイントに
  • ランタイムのデザイナーの強化
  • 高 DPI とスケーリングの修正
    • PerMonitorV2 モードのサポートの改善
  • その他
    • Control.InvokeFunc<T> を受けるオーバーロードの追加など
  • コミュニティーからのコントリビュート
    • FolderBrowserDialog のプロパティの追加や MessageBox の Try Again/Continue ボタン対応など

Announcing Windows 11 Insider Preview Build 22504

https://blogs.windows.com/windows-insider/2021/11/17/announcing-windows-11-insider-preview-build-22504/

Windows 11 Insider Preview Build 22504 が Dev Channel にリリース。

このリリースから .NET Conf でアナウンスされていた .NET Framework 4.8.1 が含まれており、.NET Framework が ARM64 をネイティブにサポートするようになった。

現状 ARM64 サポートは x86, x64 と共に %SystemRoot%\Microsoft.NET\FrameworkArm64 にインストールされ、実行ファイルのプラットフォームが ARM64 としてビルドされている場合にのみ ARM64 向け .NET Framework が使用される。AnyCPU を含め、それ以外は今まで通り x86/x64 が使用されエミュレーションで動作する。

Infer# v1.2: Interprocedural Memory Safety Analysis For C#

https://devblogs.microsoft.com/dotnet/infer-v1-2-interprocedural-memory-safety-analysis-for-c/

Infer# v1.2 がリリースされた。Infer# は静的コード解析ツールの Infer で C# のコードを解析するためのフロントエンド。今年の3月に 1.0 として GA していた。

今回のリリースではレースコンディションの検知やパフォーマンス向上、カバレッジの拡大などが含まれる。

Release 3.11.6 · unoplatform/uno

https://github.com/unoplatform/uno/releases/tag/3.11.6

Uno Platform 3.11.6 がリリースされた。

.NET 6 と Visual Studio 2022 の対応が含まれるほか、様々な改善とバグ修正が行われた。

MAUI のリリースが延期された影響で Uno Platform のプロジェクトテンプレートは Xamain を使用した従来のものが含まれ、.NET 6 でのプロジェクトはプレビューサポートとなるとのこと。

Release v1.42.0 · grpc/grpc

https://github.com/grpc/grpc/releases/tag/v1.42.0

gRPC v1.42.0 がリリースされた。NuGet パッケージとしては 2.42.0 となる。

.NET のライブラリ部分に関しては Xamarin のビルド関する不具合の修正や特定のケースでメタデータが破損する問題の修正など。

Calendar for 祝 .NET 6 GA!.NET 6 での開発 Tips や試してみたことなど、あなたの「いち推し」ポイントを教えてください【PR】日本マイクロソフト | Advent Calendar 2021 - Qiita

https://qiita.com/advent-calendar/2021/microsoft

日本マイクロソフトがサポートしている .NET 6 をメインにした Advent Calendar。

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

New dependency injection features in .NET 6: Exploring .NET Core 6 - Part 10

https://andrewlock.net/exploring-dotnet-6-part-10-new-dependency-injection-features-in-dotnet-6/

Microsoft.Extensions.DependencyInjection の .NET 6 での変更点についての記事。

IAsyncDisposable をサポートするスコープの AsyncServiceScope、Minimal API との組み合わせ、サービスが登録されているかどうかを取得できる IServiceProviderIsService、診断の強化と TryAdd* のパフォーマンス向上などに触れている。

IServiceProviderIsService については Minimal API ではラムダのパラメーターが暗黙的に DI コンテナーからの解決となる(Controller のメソッドの場合は [FromService] が必要)が、その場合パラメータとして渡されるものが DI 由来なのか、値がバインドされたものなのかの区別がつかなくなってしまうため DI コンテナーに登録されているかどうかを取得するためのメカニズムとして用意されているという話。

Rider 2021.3 Brand New Main Toolbar | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/11/16/rider-2021-3-brand-new-main-toolbar/

Rider 2021.3 で導入される新しいデザインのメインツールバーについての記事。

PowerUpを使ってC#のアセンブラを見る – NotNullVariable

https://notnullvariable.com/2021/how-to-use-power-up/

C# のコードが JIT された結果を逆アセンブル確認する PowerUp の使い方についての記事。

(C#) C#10 で構造体の既定のコンストラクタを禁止する - ネコのために鐘は鳴る

https://ikorin2.hatenablog.jp/entry/2021/11/16/064305

構造体のパラメーターなしコンストラクターを C# 10 で記述できるようになったことで使用させないようにできるという記事。

Capture Logs in Unit Tests

https://kaylumah.nl/2021/11/14/capture-logs-in-unit-tests.html

ユニットテストで ILogger をキャプチャーするにはどのような方法があるかという記事。記事では NullLogger, Moq を使う方法, xUnit の ITestOutputHelper に流す方法が書かれている。

Overriding Sealed Methods in C#

https://www.infoq.com/articles/overriding-sealed-methods-c-sharp/

sealed なメソッドをオーバーライドする方法についての記事。

記事では実行時に動的にメタデータを書き換えることでメソッドを乗っ取るといういわゆる黒魔術的な手法が解説されている。

Where Are My Favorite Extensions in Visual Studio 2022?

https://devblogs.microsoft.com/visualstudio/where-are-my-favorite-extensions-in-visual-studio-2022/

人気のある拡張が Visual Studio 2022 の Marketplace に見つからないといったケースがあるので、それらが何処かに移行したのか、統合されたのかといったことについて紹介している記事。

dotnet-6.0におけるシングルファイルアプリの変更点(5.0からの差分) - Qiita

https://qiita.com/skitoy4321/items/1cb78a42154622daa455

.NET 6 でのシングルファイルアプリケーション発行の変更点についてのまとめた記事。

ネイティブライブラリーの統合、ファイルの圧縮、TrimMode のデフォルト値の変更などについて触れている。

Unity2021.2で使えるC#9の機能 - Synamon’s Engineer blog

https://synamon.hatenablog.com/entry/csharp-9-features-on-unity-2021-2

C# 9.0 に対応した Unity 2021.2 で実際に利用可能な機能についてのまとめた記事。未サポートの機能についても触れている。

Monitoring a .NET application using OpenTelemetry - Gérald Barré

https://www.meziantou.net/monitoring-a-dotnet-application-using-opentelemetry.htm

.NET アプリケーションを OpenTelemetry を通してモニタリングする方法についての記事。

記事では .NET アプリケーションから OpenTelemetry を通して Zipkin, Prometheus にデータを収集する形を紹介している。

Anomaly Detection Using ML.NET

https://anileladag.medium.com/anomaly-detection-using-ml-net-c01e43774e44

ML.NET を使用して Anomaly Detection を実装する方法についての記事。

DAPR: a code-based approach with DOTNET

https://satyampushkar.medium.com/dapr-a-code-based-approach-with-dotnet-6570058da51a

Dapr を使用して分散した .NET アプリケーションを構成する方法についての記事。

Global Usings – A Look at New Language Features in C# 10 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/11/18/global-usings-in-csharp-10/

C# 10 の global using についての解説と、ReSharper と Rider でのサポートについての記事。

.NET 6 vs .NET 5: up to 40% speedup!

https://alexyakunin.medium.com/net-6-vs-net-5-up-to-40-speedup-ceca9112d298

ASP.NET Core + Entity Framework Core のサンプルプロジェクトを .NET 5 から .NET 6 に移行して PGO を有効にした結果、40% 程度パフォーマンスが向上したという記事。

PGO でループやキャッシュフレンドリーなロジックのようなものは 30% から 40%、IO に依存しないコードでは平均 15% 程度、Web サービスのような IO に依存する部分では 5% 程度のパフォーマンス向上がみられたとのこと。

In the Jungle of .NET Decompilers - NDepend

https://blog.ndepend.com/in-the-jungle-of-net-decompilers

.NET の逆コンパイラーについて紹介している記事。

ILSpy, dotPeek, dnSpy, JustDecompile, Ildasm, .NET Reflector など、現在使用されているものから過去のものまで。

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

theolivenbaum/h5: 🚀 The next generation C# to JavaScript compiler

https://github.com/theolivenbaum/h5

C# で書いたコードを JavaScript に Source Generator などで変換する SDK。Bridge の fork。

DamianEdwards/MinimalApis.Extensions: A set of extensions and helpers for working with ASP.NET Core Minimal APIs.

https://github.com/DamianEdwards/MinimalApis.Extensions

ASP.NET Core の Minimal API の拡張とヘルパーメソッド集。

ASP.NET Core の Minimal API ではカスタムの戻り値を提供するために IResultExtensions というものがあり、拡張メソッドを用意することで Results.Extensions.独自のリザルト() といった形でカスタム戻り値を返せるようになっている。

Extensibility Essentials 2022 - Visual Studio Marketplace

https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ExtensibilityEssentials2022

Visual Studio 2022 の拡張を実装する上で便利なツールを提供する Visual Studio の拡張。

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

Dynamic PGO in .NET 6.0.md

https://gist.github.com/EgorBo/dc181796683da3d905a5295bfd3dd95b

Dynamic PGO の動作内容と簡単なベンチマーク、アプリケーションで Dynamic PGO を有効にする設定方法、コミュニティーフィードバックを載せているドキュメント。

Visual Studioチャネルとリリースリズム

https://docs.microsoft.com/ja-jp/visualstudio/productinfo/release-rhythm

Visual Studio のリリースチャネルとそのリリースのリズムについてのドキュメント。

リリース直後、プロダクト名に Current と表記されていたのは特定バージョンのサービスリリースを行う Long-Term Servicing Channel (LTSC) あることで、最新機能を提供するリリースとの区別のためだったとのこと。Current の表記は version 17.0.1 で削除された。

csharplang/Language-Version-History.md at main · dotnet/csharplang · GitHub

https://github.com/dotnet/csharplang/blob/main/Language-Version-History.md

C# のバージョンごとに追加された言語機能などについての歴史がまとまっているドキュメント。

Migrate from ASP.NET Core 3.1 to 6.0 | Microsoft Docs

https://docs.microsoft.com/ja-jp/aspnet/core/migration/31-to-60?view=aspnetcore-6.0&tabs=visual-studio

ASP.NET Core 3.1 から 6.0 に移行するために何をすれば良いのかがまとまっているドキュメント。

Visual Studio IDE (@visualstudio) TikTok | Watch Visual Studio IDE's Newest TikTok Videos

https://www.tiktok.com/@visualstudio

Visual Studio の TikTok アカウント。

ツイート

.NET 5 から .NET 6 に移行しただけでローカルループバックでの UDP の送受信のパフォーマンスが向上したという話。

Rider で Unity の asmdef を編集すると、参照プロジェクトの補完や GUID への変更、Inlay-hints が表示されるといった手厚いサポートがあるという話。

次のような ValueTaskasyncawait しない、ショートカットするようなコードを書いた時の罠の話(スレッド)。

ValueTask FooAsync()
{
    if (pending.IsCompleteSuccessfully)
    {
        return default;
    }
    return Awaited(pending);
}

async ValueTask Awaited(ValueTask pending)
    => await pending;

この場合 pendingawait せずに終わるコードパスに流れた場合、内部の IValueTaskSourceGetResult が呼び出されないと IValueTaskSource がプーリングを実装している場合には無駄なことになってしまうのではないのか、という話。これ自体の修正方法は _ = pending.Result; のようにする。

Entity Framework Core 6.0 では Column 属性に Order を指定できるようになって、データベースのテーブルのカラムの並びを指定できるという話。

US の Microsoft Store で Windows on ARM の Development Kit 的なマシンがひっそりと発売されていたという話。

モダンでスケーラブルなソケットサーバーの基本的な記述パターンについて。

過去、Visual Studio のメニューが大文字 (capitalize) だった時期があり、現在でもそのオプションは残っていて Visual Studio 2022 で非推奨にしようとしたけど却下となったという小ネタ。

Visual Studio のエディターのタブのコンテキストメニューに Git の項目が増えたという話。

Deep Dive

[Proposal]: Self Constraint · Issue #5413 · dotnet/csharplang

https://github.com/dotnet/csharplang/issues/5413

Self constraint の提案の Issue。Spec の Proposal 自体はすでに書かれている。

Remove -r parameter for dotnet test, and change -a parameter to be shorthand for --arch, instead of --test-adapter-path by MarcoRossignoli · Pull Request #22497 · dotnet/sdk

https://github.com/dotnet/sdk/pull/22497

dotnet test での -r--results-dir-a--test-adapter-path の短縮系だったが、他のコマンドと合わせて --runtime--arch となるようにするという破壊的変更の PR。

[API Proposal]: Convert.ToInt32 overload that takes a ROSchar instead of a string · Issue #61397 · dotnet/runtime

https://github.com/dotnet/runtime/issues/61397

Convert.ToInt32ReadOnlySpan<char> を受けるオーバーロードがほしいという提案。Utf8Parser.TryParse でいいのではないか、提案者は octal を読みたいといっている、実際に欲しいのは ReadOnlySpan<byte> では、その場合 Encoding はどうするのか、ニッチなのでコアライブラリーには不要ではとか。

Minor File.ReadAllBytes* improvements by adamsitnik · Pull Request #61519 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61519

File.ReadAllBytes*Stream から RandomAccess にすることでパフォーマンスを向上するという PR。

Expose general purpose Crc32 APIs by deeprobin · Pull Request #61558 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61558

CRC32 を計算するための API を BitOperation クラスで公開するという PR。

Merge System.Security.Cryptography.Algorithms to System.Security.Cryptography by bartonjs · Pull Request #61543 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61543

System.Security.Cryptography.Algorithms にあった各種アルゴリズムの実装を System.Security.Cryptography に引っ越す PR。