2022-06-09: Windows App SDK 1.1.0, Exchange Online Journey to .NET Core, Appwrite Cloud Functions supports .NET Runtime

Published on Thursday, 09 June 2022

トピックス

Release v1.1.0 · microsoft/WindowsAppSDK

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

Windows App SDK 1.1.0 がリリースされた。

Windows App SDK 1.1 ではいくつかの新機能と安定性の向上やパフォーマンス改善が含まれている。

  • アプリケーションで同じ UI スレッド上に WinUI 3 コンテンツを持つ複数のウィンドウを作成できるようになった
  • Windows 11 の Mica とアクリル背景スタイルを使用できるようになった
  • Z-オーダー、サイズ変更や高さのあるタイトルバーといったカスタムタイトルバーの新機能
  • Windows App SDK を使用したアプリケーションの昇格した権限での実行のサポート
  • 依存も含めた自己完結型の展開を行うアプリケーションに Windows App SDK を含めることが可能になった
  • 新しい API で環境変数の PATHPATHEXT を実行時に管理、追跡できるようになった
  • アプリケーションの再起動を手動で行うことや、システム更新時に自動で行うことが可能になった

その他、詳しくはリリースノートを参照のこと。

Exchange Online Journey to .NET Core - .NET Blog

https://devblogs.microsoft.com/dotnet/exchange-online-journey-to-net-core/

Microsoft 365 の Exchange Online の .NET Core/.NET への移行事例を紹介している記事。

Microsoft 365 は Exchange に由来する Substrate (基盤) と呼ばれるサービスのセットを持っていて、それを .NET Framework から .NET Core へと移行するといった話。

Substrate は大体3,400のC#プロジェクトを持つ非常に大きなプロダクトで .NET Core へと移行するモチベーションとしてはコスト効率の向上やアクティブな開発を終えた .NET Framework からの最新のフレームワークへの移行といった点があったとのこと。

まずは PoC を兼ねてた移行として POP3 プロトコルを扱うサービスの移行から始めたとのこと。これは POP3 プロトコルが比較的小さく、依存するものが少なく収まるため。それでも140程度のアセンブリと NuGet パッケージを .NET Core へと移行する必要があった。

.NET Core アプリケーションが使うアセンブリは .NET Core か .NET Standard をターゲットとしている必要があるためアセンブリの移行には順番を決める必要があり、そのためデイリービルドからプロトコルのアセンブリの依存から依存関係グラフを作るツールを開発し、何を移行すると Substrate の他のプロセスや AppPool に影響があるのかを見つけるようにした。

この記事の時点では Substrate のリポジトリ内の1,061アセンブリが移行され、下記のサービスが .NET Core で実行されているとのこと。

  • POP3 サービス
  • IMAP4 サービス
  • Mapi-Http app pool
  • MSExchangeTransportLogSearch サービス
  • MSExchangeTransportStreamingOptics サービス
  • (進行中) EAS on http.sys (※多分 EAS は Exchange ActiveSync)
  • テストと評価システム

.NET Core への移行での重要なチャレンジの一つとして、かなり多くの数の NuGet パッケージ (Microsoft社内、社外共に) に依存していたため、.NET Standard や .NET Core に対応していない場合にパッケージ所有者を見つけることが必要となったので、パッケージの所有者のマッピングを最新に保つことの重要性を理解したとのこと。

移行した結果のパフォーマンスもいくつか紹介している。

まず POP3 は .NET Framework 4.7.2 からの比較で CPU、GC、メモリー使用量といったものが大きく改善されたとしている。またこの移行時点では Span といった新しい API への対応は行っていないとのこと。

IMAP4 は移行の手順が異なったため、.NET Framework との比較ではなく .NET 5 と .NET 6 の比較を行っている。この比較では CPU とメモリー使用量が改善され、パフォーマンスに関わりそうなコードの変更も行ったが多くは .NET 6 によるものではないかとしている。

Mapi Http は IIS の App Pool 上から Kestrel に移行されたアプリケーションで、メモリー使用量や CPU 効率が改善されたとのこと。

最後に CSO と呼ばれる Exchange ストア上の .NET 6 の Kestrel ベース gRPC アプリケーションについて。CSO はデータセンター内のノード間通信に使用されるもので、.NET Framework 版はなく最初から .NET Core で作られていたため、メールボックスからページを取得するクエリーでのシナリオでの比較がされている。その比較では REST ベースの従来の仕組みに比べ、レイテンシーやCPU、データベース CPUといったものが改善されたとのこと。異なるサービスなので直接の比較はできないが多くは Kestrel や gRPC といったものによるものだろうとしている。

まとめとして .NET Core への移行はパフォーマンス上の利点が大きく、目標として Substrate 全体を .NET Core と gRPC を使用した内部マイクロサービスへと移行を進めていくとしている。加えてビルドチームのインフラストラクチャーの変更により、.NET の最新バージョンを利用できるようになり、利用者にパフォーマンスを提供できるとしている。

Cloud Functions Using the New .NET Runtime

https://dev.to/appwrite/cloud-functions-using-the-new-net-runtime-4fkm

AppWrite (セルフホスト可能なオープンソースBaaS) の Cloud Functions のランタイムとして .NET がサポートされた。

記事では実際に AppWrite 上に .NET で実装した Cloud Functions を動かす方法を紹介している。

Performance Improvements in .NET MAUI - .NET Blog

https://devblogs.microsoft.com/dotnet/performance-improvements-in-dotnet-maui/

.NET MAUI のパフォーマンス改善についての記事。

記事では .NET 6 のプレビューから .NET 6 / MAUI GA までに行われた様々なパフォーマンス改善について数多く解説している。プラットフォームを問わないものもあるものの、特に Android 向けの改善が多く含まれている。

  • 起動時のパフォーマンス改善
    • Android でのプロファイリング方法
    • プロファイルを使った AOT
    • 単一ファイルアセンブリストア
    • Microsoft.Extensions.Hosting の削除
    • など..
  • アプリケーションサイズの改善
  • .NET PodCast サンプルアプリケーションの改善
  • その他実験的な機能と高度なオプション

This project is on hold · Discussion #689 · aaubry/YamlDotNet

https://github.com/aaubry/YamlDotNet/discussions/689

YamlDotNet の開発者である Antoine Aubry 氏が現在アクティブにプロジェクトに取り込むつもりがないという話。

Antoine 氏は既に使用する機会がなくエネルギーを割くことができないので、メンテナーやその他提案を受け付けている状況とのこと。

ReSharper and Rider 2022.1.2 Are Now Available | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/06/03/resharper-rider-2022-1-2/

ReSharper と Rider 2022.1.2 がリリースされた。

ReSharper は Ctrl+. ショートカットとパフォーマンスの修正、Rider は SQL Server の Windows 統合認証と Unity に関連する修正が行われている。

Release 8.0.0 Preview 4 · CommunityToolkit/dotnet

https://github.com/CommunityToolkit/dotnet/releases/tag/v8.0.0-preview4

.NET CommunityToolkit 8.0.0 Preview 4 がリリースされた。

いくつかの属性がリネームされ、クラスレベルでの適用が可能となるなどの変更が行われている。

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

【Generic Math】 C# 11 での演算子の新機能 | ++C++; // 未確認飛行 C ブログ

https://ufcpp.net/study/csharp/oop/generic-math-operators/

C# 11 (.NET 7) で導入される新しい演算子の機能の紹介記事。

現状、符号なし右シフト(>>>)について紹介している。

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

https://blog.jetbrains.com/dotnet/2022/06/07/net-annotated-monthly-june-2022/

JetBrains の .NET 関連情報まとめの6月号

OpenTelemetry in a C# .NET application | Implementation guide | SigNoz

https://signoz.io/blog/opentelemetry-dotnet/

オープンソースの APM である SigNoz と OpenTelemetry を組み合わせて .NET アプリケーションのモニタリングを行うことについての記事。

Using PathBase with .NET 6's WebApplicationBuilder

https://andrewlock.net/using-pathbase-with-dotnet-6-webapplicationbuilder/

.NET 6 の ASP.NET Core で PathBase を使用する方法について。

UsePathBase によるミドルウェアの追加は Routing ミドルウェアよりも先に行う必要があり、.NET 5 まではすべてコントロールしていたので問題なかったが、.NET 6 の Minimal API では暗黙的に Routing ミドルウェアが追加されるようになったため注意が必要となったことを説明している。

Securing Razor Pages Applications with Auth0

https://auth0.com/blog/securing-razor-pages-applications-with-auth0/

Razor ページアプリケーションを Auth0 で保護する方法についての記事。

The Best C# .NET Web Application Tech Stack: Choosing The Front End - Michael's Coding Spot

https://michaelscodingspot.com/web-application-tech-stack-front-end/

.NET の Web アプリケーションのフロントエンドの現状の選択肢を紹介している記事。

SPA, サーバーサイドでレンダリングするパターン、Blazor WebAssembly のようなクライアントパターンなど。

Runtime C# Code Compilation Revisited for Roslyn

https://weblog.west-wind.com/posts/2022/Jun/07/Runtime-CSharp-Code-Compilation-Revisited-for-Roslyn#compilation-startup-performance

Roslyn でランタイムに C# のソースコードをコンパイルすることについての記事。

記事ではコンパイルに必要な手順をはじめ、スクリプティング API やそれを利用したライブラリーの紹介、依存関係の管理(ライブラリ参照)といった点に触れている。

How to test ASP.NET Core Minimal APIs

https://blog.maartenballiauw.be/post/2022/06/07/how-test-aspnetcore-minimal-apis.html

ASP.NET Core の Minimal API を使用したアプリケーションのテストを記述する方法についての記事。

エントリーポイントとなるクラスを可視化する、WebApplicationFactory を使用するといったことを説明している。

Deploying Existing .NET 5 Project with Docker to AWS Lambda

https://medium.com/@vhlnd/deploying-existing-net-5-project-with-docker-to-aws-lambda-a7e0d8f1382b

既存の ASP.NET Core (.NET 5) プロジェクトを Docker イメージにして AWS Lambda 上に移行する方法についての記事。

.NET MAUI のGraphicViewで描写テスト - Qiita

https://qiita.com/hqf00342/items/390f1dbb044fb7403cea

.NET MAUI の GraphicView で描画する際のパフォーマンスを簡単にテストしてみたという記事。

前の記事では AbsoluteLayout による配置でパフォーマンスが出なかったため、GraphicView による描画の正攻法との比較となっている。

Authorization & Authentication from backend perspective pt1

https://dev.to/andreyka26git/authorization-authentication-from-backend-perspective-pt1-2239

サーバーサイド (ASP.NET Core) での認証と認可についての記事。

Part 1として Basic 認証とダイジェスト認証の実装について紹介している。

Release System.CommandLine v2.0.0-beta4.22272.1 · dotnet/command-line-api

https://github.com/dotnet/command-line-api/releases/tag/2.0.0-beta4.22272.1

System.CommandLine v2.0.0-beta4.22272.1 がリリースされた。

Avalonia platform support - why it's simple

https://dev.to/avalonia/avalonia-platform-support-why-its-simple-cjd

Avalonia のプラットフォームについての記事。

Avalonia プラットフォームと MAUI の違いや、構成について簡単に紹介している。

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

GitHub - devlooped/chromium: Run a portable Chromium using dotnet 6 and nuget.

https://github.com/devlooped/chromium

.NET CLI Tools またはアプリケーションから利用するためのライブラリーとして Chromium を組み込むツール/ライブラリー。

Playwright を利用したプロジェクトでブラウザー自動操作のために組み込み Chromium を利用したいというケースなどで役立つとのこと。

GitHub - awslabs/dotnet-nativeaot-labs: A place to learn about and experiment with .NET NativeAOT on AWS.

https://github.com/awslabs/dotnet-nativeaot-labs

AWS Lambda 上で .NET の NativeAOT の動作させることについて学ぶためのリポジトリ。

mukai1011/types-dotnet: Type definition of .NET

https://github.com/mukai1011/types-dotnet

.NET アプリケーションに JavaScript エンジンを組み込む ClearScript で使うための .NET クラスライブラリーの TypeScript 型定義を作るというリポジトリ。

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

ツイート

AWS がオープンソースプロジェクトにはクレジットを提供するという話(AWS の開発に利用できるということ)。

.NET にグリーンスレッドを実装する試みがあるというような話。

Deep Dive

Implement Http/2 WebSockets by Tratcher · Pull Request #41558 · dotnet/aspnetcore

https://github.com/dotnet/aspnetcore/pull/41558

HTTP/2 上の WebSocket サポートを実装する PR。

Add Document Outline Tool Window by emilyanas2323 · Pull Request #61784 · dotnet/roslyn

https://github.com/dotnet/roslyn/pull/61784

Visual Studio にソースコードのドキュメントアウトラインを表示するツールウィンドウを実装する PR。

Aspnet support for webtransport · Issue #39583 · dotnet/aspnetcore

https://github.com/dotnet/aspnetcore/issues/39583

ASP.NET Core (Kestrel) での WebTransport サポートの Issue。