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
の追加
- Win32, WPF, Windows Forms で利用可能なウィンドウを扱う高レベル API
- 入力
- 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
📢 Windows App SDK 1.0 Stable release is live! The WinAppSDK is focused on empowering developers to build the most productive apps on Windows and we're looking forward to your feedback! Tag your tweets with #WinAppSDK to get the team's attention! https://t.co/q9CvT6eHEy
— Kevin Gallo (@kevintgallo) November 16, 2021
- Announcing: WinUI 3 in Windows App SDK 1.0! 🎆🎉🎇 · Issue #6325 · microsoft/microsoft-ui-xaml
- Stable channel release notes for the Windows App SDK - Windows apps | Microsoft Docs
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.Invoke
にFunc<T>
を受けるオーバーロードの追加など
- コミュニティーからのコントリビュート
- FolderBrowserDialog のプロパティの追加や MessageBox の Try Again/Continue ボタン対応など
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 が使用されエミュレーションで動作する。
Scott Hunter announcing .NET Framework 4.8.1 with Arm64 support https://t.co/vpzVBcPsiC
— .Net LibHunt (@dotNetLibHunt) November 14, 2021
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.独自のリザルト()
といった形でカスタム戻り値を返せるようになっている。
Trying out #aspnetcore Minimal APIs & like the idea of being able to unit-test your APIs & have them self-describe to Swagger (no attributes or metadata needed)? You might like my MinimalApis.Extension library: https://t.co/3EliX3mCtQ
— Damian Edwards #GetVaccinated (@DamianEdwards) November 13, 2021
In preview, pls log issues!
fyi @nickchapsas
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 を有効にする設定方法、コミュニティーフィードバックを載せているドキュメント。
Dynamic PGO in .NET 6.0 is 🚀, Please, help us to recognize the efforts Andy, David and the team made to implement this feature by sharing your numbers, read more here: https://t.co/mskM4S3exi
— Egor Bogatov (@EgorBo) November 12, 2021
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
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 アカウント。
ツイート
Solid .NET6 perf stats from tests I ran earlier today...
— Alistair Evans (@evocationist) November 12, 2021
We have a key throughput benchmark writing+reading UDP on loopback, that averages about a 200MB/sec throughput increase just by changing to .NET6! 🚀
That's amazing gain; nice one, runtime folks.@davidfowl @terrajobst pic.twitter.com/07KUjjA9ft
.NET 5 から .NET 6 に移行しただけでローカルループバックでの UDP の送受信のパフォーマンスが向上したという話。
Did you know that editing @unity asmdef files in @JetBrainsRider got a lot more powerful recently - no it is not automatically adding references yet 😅 - BUT
— Marcel Wiessler (@marcel_wiessler) November 12, 2021
adding references is fast and chill now and I love it 🥰
thanks @citizenmatt pic.twitter.com/XVgAdvHJ1L
Rider で Unity の asmdef を編集すると、参照プロジェクトの補完や GUID への変更、Inlay-hints が表示されるといった手厚いサポートがあるという話。
Got reminded of something on Friday (that I've fixed in at least 4 other code-bases in the past): many people now know that accessing the outcome of ValueTask[<T>] more than once us undefined behaviour (thanks to IVTS), but so is *not accessing it at all*; I've seen this in (1)
— Marc Gravell (@marcgravell) November 13, 2021
次のような ValueTask
を async
で await
しない、ショートカットするようなコードを書いた時の罠の話(スレッド)。
ValueTask FooAsync()
{
if (pending.IsCompleteSuccessfully)
{
return default;
}
return Awaited(pending);
}
async ValueTask Awaited(ValueTask pending)
=> await pending;
この場合 pending
を await
せずに終わるコードパスに流れた場合、内部の IValueTaskSource
の GetResult
が呼び出されないと IValueTaskSource
がプーリングを実装している場合には無駄なことになってしまうのではないのか、という話。これ自体の修正方法は _ = pending.Result;
のようにする。
When you use inheritance in models, you can be not satisfied with the default EF Core columns order in the created tables.
— Oleg Kyrylchuk (@okyrylchuk) November 13, 2021
In EF Core 6.0, you can specify columns order with ColumnAttribute.#dotnet6 #efcore6 #coding #devcommunity pic.twitter.com/1VIhNwzOa4
Entity Framework Core 6.0 では Column
属性に Order
を指定できるようになって、データベースのテーブルのカラムの並びを指定できるという話。
Also found this https://t.co/J5olfE9vIQ. But it is kinda expensive@sinclairinat0r It looks like it is now available in the US?
— 🧙♂️Dirk Lemstra (@MagickNET) November 13, 2021
US の Microsoft Store で Windows on ARM の Development Kit 的なマシンがひっそりと発売されていたという話。
This is what a modern basic scalable socket server looks like in .NET https://t.co/jFhHqp9Rxn
— David Fowler 🇧🇧🇺🇸💉💉💉 (@davidfowl) November 14, 2021
モダンでスケーラブルなソケットサーバーの基本的な記述パターンについて。
Interestingly there was an attempt to deprecate it in VS 2022, but it got rejected :)
— Oleg Tkachenko (@olegtk) November 18, 2021
過去、Visual Studio のメニューが大文字 (capitalize) だった時期があり、現在でもそのオプションは残っていて Visual Studio 2022 で非推奨にしようとしたけど却下となったという小ネタ。
And finally git operations were added to context menu to make it easy to quickly diff a file against its base, or revert without needing to find it in Solution Explorer.
— David Kean (@davkean) November 18, 2021
I find this particularly helpful for designers which don't expose this on their right-click context menu. pic.twitter.com/mCi8HjAUlm
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.ToInt32
に ReadOnlySpan<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。