2021-09-17: .NET 6 RC1, Visual Studio 2022 Preview 4, WinUI 2.7, Uno Platform 3.10

Published on Friday, 17 September 2021

主なトピックス

.NET 6 RC 1 と Visual Studio 2022 Preview 4 がリリースされました。RC ということで若干の breaking changes はありますが GA に向けたステップといったリリースです。Preview から Go live ライセンスとなったのでプロダクション環境での利用が可能になります。

また、マルチプラットフォームアプリを作るためのフレームワーク MAUI は .NET 6 には入らないことなどがアナウンスされています。

Uno Platform 3.10 がリリースされました。.NET 6 RC1 への対応や Windows 11 のスタイルなどに対応したようです。

Silverlight のオープンソース代替実装、OpenSilver のベータがリリースされました。これは C#/WPF を Web 技術上で動かす CSHTML5 をベースとして Silverlight のコードを Web 技術上で動かすものです。Silverlight は2021年10月12日でサポート終了するため、その延命処置としてといった目的が大きそうです。

.NETのクラスライブラリ設計 改訂新版の予約が Amazon でできるようになりました。10月7日に発売だそうです。

ヘッドライン

Announcing .NET 6 Release Candidate 1 - .NET Blog

https://devblogs.microsoft.com/dotnet/announcing-net-6-release-candidate-1/

.NET 6 Release Candidate 1 がリリース。RC1 以降では機能の追加などから GA に向けて品質の向上にフォーカスする形。 また、このバージョンから "go live" ライセンスとなり実運用環境での使用がサポートされる。 Visual Studio 2022 Preview 4と共に使用することが前提で Visual Studio 2022 for Mac Preview 1 は追って対応。

記事ではソースからビルドすること(.NET 6 で tarball からビルドできるようになったなど)、Profile-guided optimization、Crossgen2、セキュリティー関連についてなどが触れられている。

Visual Studio 2022 Preview 4 is now available! - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/visual-studio-2022-preview-4-is-now-available/

Visual Studio 2022 Preview 4 がリリース。

ファイル内検索が改善され、大きいソリューションなどでは3倍近く早くなった。

ブレークポイントの条件に "Dependent Breakpoint" という「特定のブレークポイントにかかっていた場合にブレークする」という設定の追加。ASP.NET での CSS 同期や MAUI サポートを初めとするホットリロード機能の強化。フォルダー階層と名前空間を合わせる "Sync Namespaces" の追加(ReSharper の Adjust Namespaces 相当)。

Update on .NET Multi-platform App UI (.NET MAUI) - .NET Blog

https://devblogs.microsoft.com/dotnet/update-on-dotnet-maui/

MAUI の状況と .NET MAUI Preview 8 について。

MAUI は開発状況的に .NET 6 の11月の GA には入らず、2022年の Q2 での GA を目指すとのこと。それまでは Xamarin の強化を行い、製品開発への採用は Xamarin を推奨する。.NET 6 GA の段階で必要な機能は提供するがしばらくはプレビューで品質向上と移行のための準備を進める。

また .NET 6 RC1 では "Go Live" だが、MAUI は除外され、RC2 で Preview となる。

Visual Studio 2022 Preview 4 の Mobile development with .NET ワークロードに MAUI が含まれるようになった。Windows デスクトップアプリケーションをターゲットにしたい場合には "Desktop Development with .NET", "UWP", "Desktop Development with C++" ワークロードも必要。

また、XAML のホットリロードにも対応し、Windows をはじめ iOS, Android でも同様に動作する。

.NET MAUI SDK はアップデートで ASP.NET Core などと同様に .NET Host Builder パターンを使用するようになった。

WinUI 2.7 Release Notes - Windows apps | Microsoft Docs

https://docs.microsoft.com/en-us/windows/apps/winui/winui2/release-notes/winui-2.7

Windows UI Library 2.7 がリリース。

InfoBadge コントロール、ColorPicker の方向設定(横置き)の追加。

.NET September 2021 Updates – 5.0.10 and 3.1.19 - .NET Blog

https://devblogs.microsoft.com/dotnet/september-2021-updates/

.NET 5.0.10 と 3.1.19 がリリース。

セキュリティーアップデートを含まない、信頼性やその他バグ修正等の改善。

.NET 5 の Runtime には GCConserveMemory という GC の設定が追加された。GCConserveMemory は Gen 2 で意味のある生きたデータの割合の閾値で設定値として 1-9 をとる。例えば 3 を指定した場合には Gen 2 にあるべきデータは 30% となり、これによってフラグメンテーションが 70% 以上になるとよりブロッキング Gen 2 GC が実行される(つまり大きい値を指定すると Gen 2 をコンパクトに保とうとする)。

Uno Platform 3.10: Day-0 support for .NET 6 RC1, WinUI InfoBadge, Windows 11 Fluent Styles

https://platform.uno/blog/uno-platform-3-10-day-0-support-for-net-6-rc1-winui-infobadge-windows-11-fluent-styles/

Uno Platform 3.10 がリリース。

.NET 6 RC1 への対応や Windows 11 のスタイルなどに対応、WinUI に追加された InfoBadge への対応など。多くの改善と修正、サンプルコードの追加が行われた。

HTTP/3: Enable in Kestrel by default in .NET 7 · Issue #36486 · dotnet/aspnetcore

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

.NET 7 で Kestrel の HTTP/3 サポートがデフォルトで有効になる予定。

Introducing OpenSilver

https://opensilver.net/announcements/introducing-opensilver.aspx

Silverlight のオープンソース代替実装、OpenSilver のベータがリリース。

C#/WPF を Web 技術上で動かす CSHTML5 をベースとして Silverlight のコードを Web 技術上で動かすツールキット。

Open sourcing the .NET 5 C# Language Extension for SQL Server - Microsoft SQL Server Blog

https://cloudblogs.microsoft.com/sqlserver/2021/09/08/open-sourcing-the-net-5-c-language-extension-for-sql-server/

SQL Server 2019 から利用できる外部コードを実行することで様々な言語を呼び出せる仕組みで .NET 5 / C# を使用する拡張がオープンソースで公開された。

Release 1.4.0-beta.3 · mysql-net/MySqlConnector

https://github.com/mysql-net/MySqlConnector/releases/tag/1.4.0-beta.3

Async MySQL Connector の 1.4.0-beta.3 がリリース。

1.4.0 シリーズでは .NET 6 のサポートの追加や、netstandard1.3 のサポートの削除などが行われている。

Release v5.0.10 · npgsql/npgsql

https://github.com/npgsql/npgsql/releases/tag/v5.0.10

Npgsql 5.0.10 がリリース。

様々な不具合の修正と、xid8 データ型のサポートの追加など。

Security Bulletin - Announcements - Travis CI Community

https://travis-ci.community/t/security-bulletin/12081

Travis CI の脆弱性について。パブリックなリポジトリをフォークした先で PR を作った際に元リポジトリの Secrets が露出してしまう問題があった。

経緯や対応方法は下記の記事が詳しいので Travis CI を使用していた場合には対応が推奨。

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

Introducing Package Source Mapping - The NuGet Blog

https://devblogs.microsoft.com/nuget/introducing-package-source-mapping/

複数の NuGet パッケージソースを持つ場合に特定のパッケージやパッケージ名のパターンでどのパッケージソースを使用するか指定できる機能についての記事。

例えば特定の名前のパッケージ(ContosoContoso.*)は常に社内の NuGet パッケージレジストリを使うといったことが可能となる。

Visual Studio 2022 Preview 4 または nuget.exe 6.0.0-preview.4 または .NET SDK 6.0.100-rc.1 (.NET 6 RC1) 以降が必要。

Reflection via source generators

https://dev.to/byme8/aot-reflection-4ijb

Source Generator でリフレクションで取得するようなものをあらかじめ生成しておくことでリフレクションのようなことをする場合でもパフォーマンスを稼げるのではないかというアイデアの記事。

C#でIDisposableをusingしたのにDisposeしてくれない件

http://makiuchi-d.github.io/2021/09/16/csharp-using-idisposable.ja.html

場合によっては try-finallyfinally が呼び出されないことがあるという話。

通常例外がエントリーポイントまでさかのぼって catch されなかった場合、「ハンドルされていない例外 (Unhandled Exception)」となりアプリケーションが終了される。その際、一番外側でも catch がない場合 finally が実行されない可能性がある。

static void Main(string[] args)
{
    try
    {
        try
        {
            throw new Exception();
        }
        finally
        {
            // 実行される
            Console.WriteLine("Finally2");
        }
    }
    catch (Exception e)
    {
        // ここで throw すると結局 Unhandled Exception となるので try-catch-finally の finally は実行されない可能性がある
        throw;
    }
    finally
    {
        // 実行されない可能性がある
        Console.WriteLine("Finally");
    }
}

大抵はユーザーコードにたどり着くまでにフレームワークのどこかで try-catch が含まれているので問題にならないが、素のコンソールアプリケーションや Top-level Statements などで、using / using var を利用している場合等で問題になる可能性がある。

計量的な統計を扱うためのSystem.Diagnostics.Metrics API - Qiita

https://qiita.com/skitoy4321/items/ae506268fb18fc2ac54d

.NET 6 で追加される System.Diagnosics.Metrics API についての記事。API の概要とシナリオ、実際の使い方などを解説。

Web API (OpenAPI) の探索やテストに便利な HttpRepl を使ってみた

https://zenn.dev/08thse/articles/47-tool-httprepl

.NET Tools として提供されている HTTP を REPL のような形で操作できる HttpRepl の使い方の記事。

Apples in MAUI

https://www.telerik.com/amp/apples-maui/WEx1ZE1sRUVUWkE5S0dNbEhBNXJyUkU3T1Q4PQ2

MAUI で iOS アプリケーションを動かすまでの macOS 開発環境でのステップバイステップ。

[雑記] コンパイル結果に影響を及ぼす属性

https://ufcpp.net/study/csharp/start/miscreservedattribute/

AttributeUsageConditional, Obsolete など実行時に属性を解釈するのではなくコンパイル時にコンパイラーが知るためにある属性についての記事。

NullableContext のようなコンパイラーが生成する属性についても。

API Versioning in ASP.net Core - .NET Core Tutorials

https://dotnetcoretutorials.com/2017/01/17/api-versioning-asp-net-core/

ASP.NET Core で API のバージョニングを実現する Microsoft.AspNetCore.Mvc.Versioning の使い方についての記事。

.NET5.0製のREST APIサーバーを、AWS CodePipelineでビルドしてコンテナ化してECSでデプロイする。 - Qiita

https://qiita.com/tricrow/items/dad78c99cb77c7c6be9b

.NET 5 アプリケーションを AWS CodePipeline/CodeBuild でビルドして、ARM (Graviton) な ECS インスタンスで動かすという話。

Debugging a .NET App on Linux from Windows Visual Studio with WSL - NDepend

https://blog.ndepend.com/debugging-a-net-app-on-linux-from-windows-visual-studio-with-wsl

Visual Studio から .NET 5 アプリケーションを WSL 2 上の Linux で動かしてデバッグするための手順についての記事。

.NET Framework のアプリを移植してきた場合、DebugTypefull となっている場合があるので portable にするようにといった話も。

SOCKS Proxy Support In .NET - .NET Core Tutorials

https://dotnetcoretutorials.com/2021/07/11/socks-proxy-support-in-net/

.NET 6 で SOCKS プロキシーに対応したのでその使用方法についての記事。

Looking inside ConfigurationManager in .NET 6: Exploring .NET Core 6 - Part 1

https://andrewlock.net/exploring-dotnet-6-part-1-looking-inside-configurationmanager-in-dotnet-6/

ConfigurationBuilder の代わりとなる .NET 6 で導入された ConfigurationManager についての違いと利点などについての記事。

ConfigurationManager は IConfigurationBuilder を実装しているが ConfigurationBuilder と異なり、設定ソースの追加と削除が行われた時点で設定が確定するため部分的な取り出しが簡単になっている (IConfigurationRoot を実装していて自身を返すだけになっている)。ConfigurationBuilder は一度 Build しないと読めないため、設定に依存する設定がある場合の取り回しが悪かった。

新たなWeb認証オプションと.NET MAUI Essentialsを加えたXamarin.Essentials 1.7

https://www.infoq.com/jp/news/2021/09/xamarin-essentials-1-7/

Xamarin.Essentials 1.7 についての記事。Web 認証と MAUI 対応について。

Backend For Frontend Authentication Pattern with Auth0 and ASP.NET Core

https://auth0.com/blog/backend-for-frontend-pattern-with-auth0-and-dotnet/

Backend for Frontend (BFF) のような構成で Auth0 と ASP.NET Core を使った認証実装パターンについての記事。

Minimal APIs at a glance in .NET 6

https://www.hanselman.com/blog/minimal-apis-at-a-glance-in-net-6

.NET 6 (ASP.NET Core) の Minimal API を使用したサンプルコードの記事。

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

EgorBo/StaticPGO_Example: How to collect a static (not the dynamic one) PGO and re-use it during "dotnet publish"

https://github.com/EgorBo/StaticPGO_Example

.NET 6 の Static PGO を試すためのサンプルリポジトリ。

mayuki/Kokuban: Simplifies styling strings in the terminal for .NET application

https://github.com/mayuki/Kokuban

コンソールに表示される文字列に対して色や下線など装飾を行うためのライブラリ。

mayuki/Chell: Write scripts with the power of C# and .NET

https://github.com/mayuki/Chell

シェルスクリプトのような作業を C# でも書きやすくするためのプロセス実行とユーティリティのライブラリ。

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

Scott Hanselman (@shanselman) TikTok | Watch Scott Hanselman's Newest TikTok Videos

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

Scott Hanselman の TikTok。

.NETのクラスライブラリ設計 改訂新版 (マイクロソフト関連書) | Krzysztof Cwalina、Jeremy Barton、Brad Abrams, 猪股 健太郎、河合 宜文 (監訳), 藤原 雄介 |本 | 通販 | Amazon

https://www.amazon.co.jp/dp/4296080040

.NETのクラスライブラリ設計 改訂新版の発売日が10月7日となり、Amazon での予約が開始。

ツイート

Azure Functions で .NET 6 が Preview という形で使用できるように(これまでは Early Preview 扱い)。

MSBuild が 16.10 で文字列の dedup するようになって binlog が小さくなって、ビルドが速くなったという話。他にも binlog にファイルを埋め込めるようになった等の改善点など。

Source Generator から Assembly.GetEntryAssembly()null かどうかを調べることで IDE 上で動いているかどうか確認できるので、ビルド時にのみ実行したい Source Generator を作る場合には使えるというテクニック。

Visual Studio が 64bit になったことでアドレス空間に余裕ができた。例えばアドレス空間を節約するため NGEN の対象はよく使われるコードパスのもののみに絞っていた(のでたまに JIT が走る)が、主要なアセンブリの大半を NGEN できるようになったという話。

SignalR の Hub は IAsyncEnumerable<T> をサポートしているのでデータのストリーミングできるという話。

Deep Dive

Add initial regex source generator by stephentoub · Pull Request #59186 · dotnet/runtime

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

Regex の Source Generator の初期実装のPR。

Source Generator であらかじめ正規表現マッチ用のコードを生成しておくことでパフォーマンスを向上することが目的。 現時点では RegexOptions.Compiled のコードを流用して、C# の Regex のマッチ用のコードを生成する形。

Need to run non-English text through UTF8Encoding for PGO scenarios · Issue #57698 · dotnet/runtime · GitHub

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

.NET 6 で PGO をかけた結果 UTF8Encoding が遅くなってしまうケースが発生しているという話。

Non-English なテキストを処理するようなデータでプロファイルしていないため、ギリシャ語やキリル文字を処理するようなケースでパフォーマンスが若干低下している。多分日本語も該当する可能性がある。コアライブラリは元から PGO で最適化された R2R の形式で出荷されているので影響を受ける。

Add FreeBSD RIDs to known targets by josteink · Pull Request #11972 · dotnet/installer

https://github.com/dotnet/installer/pull/11972

インストーラーが知っている Runtime Identifier に FreeBSD が追加することでインストールできるようにする PR。

Support multi-targeting for Roslyn components by eerhardt · Pull Request #20793 · dotnet/sdk

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

Roslyn のバージョンが Visual Studio 2019 (Roslyn 3.10) と 2022 (Roslyn 4.0) という形で複数ある都合、読み込むものを分けられるようにするという PR (マルチターゲット化)。

Marshal.AllocHGlobal/FreeHGlobal is ~150x slower in .NET than legacy mono on device (tvOS) · Issue #58939 · dotnet/runtime

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

tvOS で Marshal.AllocHGlobal/FreeHGlobal が急激に遅くなったのだけどなぜ?という話。レガシー Mono では問題なかったが .NET ではとても遅い、となっているが実際はランタイム自体はどちらも Mono で .NET 6 世代で Marshal.AllocHGlobal の実装が .NET の NativeMemory.Alloc に変わった影響。

Mono の固有実装と異なり素直に P/Invoke を使うようになった影響で P/Invoke 呼び出しの GC セーフにするための処理でオーバーヘッドが生まれてしまった。

[API Proposal]: Add Arm64 to ProcessorArchitecture and ImageFileMachine enums · Issue #58970 · dotnet/runtime

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

ProcessorArchitectureImageFileMachine に ARM64 の値がないので増やしたいという提案。 ところがそもそもこの値は .NET Core/.NET 5 以降では事実上の非推奨でほぼ機能しておらず、むしろ AssemblyName にある ProcessorArchitecture は Obsolete にしたいという話に。

Create using-alias-types.md by CyrusNajmabadi · Pull Request #5174 · dotnet/csharplang

https://github.com/dotnet/csharplang/pull/5174

名前を持つ型に対するエイリアスとして using A = Foo.Bar.Baz; はできるが、using Position = (int X, int Y); のようなタプルや配列型、ポインター型などに対するエイリアスは定義できないので定義できるようにする提案。

[Proposal]: Event hookup in object initializer · Issue #5176 · dotnet/csharplang

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

オブジェクト初期化子で event ハンドラーをセットできてもいいのではないかという提案。