2021-12-03: Visual Studio 2022 v17.0.2, Cake v2.0.0, Uno Platform 4.0

Published on Friday, 03 December 2021

今年も Advent Calendar の時期がやってきました。Qiita の Advent Calendar には .NET 関連ではいくつか作られています。

日本マイクロソフトのサポートする Advent Calendarもあり今年は .NET 6 がメインテーマです。いくつかのカレンダーはまだ若干数枠があるようですので興味のある方は参加してみるとよさそうです。

トピックス

Visual Studio 2022 version 17.0.2

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

Visual Studio 2022 version 17.0.2 がリリースされた。

機能的な変更としては Python ワークロードが脆弱性対応のために 3.7.8 が削除され 3.9.7 となった。その他 Blazor/Razor の IntelliSense に関する問題などを含むバグ修正が行われた。

Cake - Cake v2.0.0 released

https://cakebuild.net/blog/2021/11/cake-v2.0.0-released

Cake 2.0.0 がリリースされた。

主な変更点は下記の通りとなっている。

  • C# 10 と .NET 6 の対応
  • dotnet エイリアスへの対応の改善
  • GitHub Actions と Azure Pipelines の統合の改善
  • .NET Framework と .NET Core の Cake runner の削除
  • ターゲットフレームワークの更新
  • Docker イメージの更新

Cake 2.0 から .NET Framework と .NET Core 1.x, 2.x, 3.0 のサポートが削除され、.NET Core 3.1 以上が必要となっているとのこと。

Announcing Uno Platform 4-0. Four major components added.

https://platform.uno/blog/announcing-uno-platform-4-0-four-major-components-added/

Uno Platform 4.0 がアナウンスされた。

Uno Platform 4.0 では新たに Visual Studio Code 統合、Figma 統合、Uno Platform Extensions、Uno Toolkit (UI Toolkit) の4つのプラットフォーム要素が追加となる。

Visual Studio Code 統合は Visual Studio Code と GitHub Codespaces や GitPod での開発を可能とする拡張(プレビュー)。Windows, Linux, macOS を開発環境としてサポートし、XAML のコード補完やプレビューやホットリロードといった開発支援も提供する。

Uno Platform Extensions は Microsoft Extensions (ロギング、ホスティング等) をベースとした形で Uno Platform の共通基盤を提供する。

Figma 統合は Figma でデザインしたものを XAML としてエクスポートするための Figma プラグイン。

Uno Toolkit は WinUI では標準で備わっていないようなコンポーネントを提供する。これには NavigationBar や TabBar といったものが含まれる。

記事ではその他 Breaking Changes、Surface Duo や Android Foldable、Windows Community Toolkit for WinUI についても触れている。

Release 2.1.0 · mysql-net/MySqlConnector

https://github.com/mysql-net/MySqlConnector/releases/tag/2.1.0

Async MySQLConnector 2.1.0 がリリースされた。

このバージョンではプールからのコネクションを開く際のパフォーマンスが2倍になったとのこと。ただし Amazon Aurora RDS では失敗する可能性があり、明示的に無効にする場合には Pipelining = False; を Connection String に記述する必要がある。

その他に MySQL 8.0 のクエリー属性のサポートの追加(8.0.23 以降またはプリペアードステートメントを使う場合は 8.0.26 以降が必要)、MySqlDecimal 型サポートの追加、Microsoft.Extensions.Logging のロギングでロガー名としてデフォルトで MySqlConnector. プレフィックスをつけるようになった、などの改善が含まれている。

ReSharper 2021.3 Goes Beta! | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/12/01/resharper-2021-3-beta/

ReSharper 2021.3 Beta がリリースされた。

ReSharper 2021.3 では C# 10 と Visual Studio 2022 の対応をはじめとして、幾つかの改善が行われている。今回 EAP から Beta となった。

Rider 2021.3 Goes Beta | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/12/01/rider-2021-3-goes-beta/

Rider 2021.3 Beta がリリースされた。

Rider 2021.3 では C# 10 と .NET 6 の対応、メインツールバーをはじめとする UI のリフレッシュ、デバッガーのアップデートなど様々な改善が行われている。ReSharper と同様に EAP から Beta となった。

Release Support for installation of multiple versions, warnings for deprecated versions · actions/setup-dotnet

https://github.com/actions/setup-dotnet/releases/tag/v1.9.0

GitHub Actions のアクション actions/setup-dotnet の 1.9.0 がリリースされた。

このバージョンから複数の .NET を一度にインストールできるようになった。

- uses: actions/setup-dotnet@v1
  with:
    dotnet-version: | 
      3.1.x
      5.0.x

また廃止されたバージョンをインストールした場合に警告を出力するようにもなったとのこと。

ClangSharp and LLVMSharp · Issue #184 · dotnet-foundation/projects

https://github.com/dotnet-foundation/projects/issues/184

ClanSharp と LLVMSharp のリポジトリーが Microsoft 配下から .NET Foundation 配下へと移管された。

Release Diagnostics Release - v6.0.257301 · dotnet/diagnostics

https://github.com/dotnet/diagnostics/releases/tag/v6.0.257301

.NET の診断ツール v6.0.257301 がリリースされた。

各種ツールにいくつかの改善が行われ、新たに dotnet-dsrouter ツールが追加された。

dotnet-dsrouter は Android や iOS, tvOS といったデバイスで動作をはじめ、リモートで動作している .NET ランタイムに各種診断ツール (dotnet-monitor, dotnet-counter など) を接続するための通信転送ツール。各種診断ツールは IPC (Unix Domain Socket) を使用して接続するので dotnet-dsrouter が IPC で待ち受けて、何らかの通信経路でクライアントと接続してデータを転送する仕組みを提供する。

dotnet-dsrouter のドキュメントでは Android の .NET アプリケーションのトレースを adb 経由でローカルコンピューターから吸い上げる方法などが書かれている。

Release .NET 5.0.12 · dotnet/efcore

https://github.com/dotnet/efcore/releases/tag/v5.0.12

.NET 5 に対応する Entity Framework Core 5 の更新バージョン 5.0.12 がリリースされた。

.NET 5 SDK とのバージョン合わせのリリースとなるが、1点だけバグ修正が 6.0 からバックポートされている。

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

TargetFramework net5.0 なコードを .NET 6 ランタイムで動かす

https://ufcpp.net/blog/2021/11/latestmajor/

プロジェクトビルド時のターゲットフレームワークよりも上位のバージョンのランタイムで動かす RollForward についての解説記事。

例えば .NET 5 でビルドされたアプリケーションを再コンパイルなしで .NET 6 のランタイムで動作させるといったことが可能になる。その際設定方法や注意点など。

Azure Functions v4 における Dynamic PGO と ReadyToRun の使い分け - しばやん雑記

https://blog.shibayan.jp/entry/20211130/1638265857

Azure Functions v4 での .NET 6 の Dynamic PGO と ReadyToRun の効果とその使い分けについての記事。

Azure Functions という特性から踏まえた選択についてと実際の設定方法、効果の比較をしている。

.NET 6でLINQに追加されたメソッド - Qiita

https://qiita.com/RyotaMurohoshi/items/14efd4492ac14ee635cd

.NET 6 で追加された LINQ のメソッドを紹介している記事。

新規に追加されたメソッドに加えて、SingleOrDefault/FirstOrDefault に追加されたオーバーロードについても触れている。

Deploy a .NET API to Heroku through GitHub Actions

https://dev.to/cristofima/deploy-a-net-api-to-heroku-through-github-actions-39fg

ASP.NET Core で実装した API アプリケーションを GitHub Actions を使用して Heroku にデプロイする方法についての記事。

Validated Strongly Typed IOptions

https://medium.com/c-sharp-progarmming/validated-strongly-typed-ioptions-400021f23136

Microsoft.Extension.Configurations の IOptions を使用する際に System.ComponentModel.DataAnnotations の属性を使用して、設定値のバリデーションを行うことについての記事。

Running a .NET 6 Service on a Specific Port

https://jeremybytes.blogspot.com/2021/11/running-net-6-service-on-specific-port.html

.NET 6 / ASP.NET Core 6 でコードから指定したポートでアプリケーションを起動することについての記事。

従来 UseUrls を使用してバインドする URL を指定できたが、.NET 6 の WebApplicationBuilder の WebHost に対して UseUrls を指定しても効果がない。代わりに ConfigureKestrel で直接リッスンするポートを指定することで動作するとのこと。

Get to Know EF Core 6

https://devblogs.microsoft.com/dotnet/get-to-know-ef-core-6/

Entity Framework Core 6 のお役立ち記事や動画のまとめ記事。

Uploading files with ASP.NET Minimal APIs

https://dev.to/gsferreira/uploading-files-with-aspnet-minimal-apis-2036

re:Invent 2021 .NET セッション | Amazon Web Services

https://aws.amazon.com/jp/blogs/news/net-at-reinvent-2021/

Amazon re:Invent 2021 (12/3 まで開催のオンラインイベント) での .NET セッションの紹介記事。

DataTable からデータ抽出方法の性能比較 on .NET 6

https://zenn.dev/okazuki/articles/performance-of-datatable-on-dotnet

.NET 6 での DataTable のパフォーマンスについての記事。

意外にもベンチマークを取った多くのケースで .NET Framework 4.8 のほうがパフォーマンスが良いという結果となっている。

UnityでC#のアセンブラを見る

https://notnullvariable.com/2021/jit-asm-for-unity/

Unity の Mono での JIT コンパイラーの JIT 結果を見るツールの紹介記事。

.NET6/C#10 で動的にJsonパースする標準クラス JsonNode - Qiita

https://qiita.com/hqf00342/items/6dd97a99c5c46c14e0e4

動的に JSON をパースするライブラリーの比較記事。

JsonNode, System.Text.Json, DynaJson, DynamicJson, Utf8Json, JmesPath.Net での比較がなされている。

.NET6 ASP.NET + React + TypeScriptでリアルタイムチャットアプリを作る - Qiita

https://qiita.com/raycho/items/45a4f2f929d8a21b2fc3

.NET 6 で ASP.NET Core SignalR と React 及び TypeScript を使用したサンプルアプリケーションを実装したことについての記事。

.NET 6 Web APIs with OpenAPI TypeScript Client Generation

https://medium.com/@chrlschn/net-6-web-apis-with-openapi-typescript-client-generation-a743e7f8e4f5

ASP.NET Core の OpenAPI サポートを通じて、API へのアクセスのための TypeScript のコード生成などを行う方法についての記事。

Validating JSON with schema in .NET

https://medium.com/@niteshsinghal85/validating-json-with-schema-in-net-7bdc02b0ef3c

NJsonSchema を使用して JSON を JSON Schema で検証する方法についての記事。

Upgrading a .NET 5 "Startup-based" app to .NET 6: Exploring .NET Core 6 - Part 12

https://andrewlock.net/exploring-dotnet-6-part-12-upgrading-a-dotnet-5-startup-based-app-to-dotnet-6/

.NET 5 の Startup クラスをベースにしたアプリケーションを .NET 6 の WebApplicationBuilder ベースへと書き換える上でのポイントを解説している記事。

xunit.netで、テストに対して独自の属性を付ける(Trait) - Qiita

https://qiita.com/skitoy4321/items/69d1444a1e30826ce4a8

xUnit で独自の属性を持つテストケースを収集して実行できる仕組みがあり、その独自の Trait の実装方法についての記事。

Introducing the new Razor editor in Visual Studio 2022

https://devblogs.microsoft.com/visualstudio/introducing-the-new-razor-editor-in-visual-studio-2022/

Language Server Protocol (LSP) ベースとなった Visual Studio 2022 の Razor エディターについての記事。

新しい Razor エディターで使用できるようになった機能を紹介している。ホットリロードや Live Share のサポートも新しいエディターによるものとのこと。

記事の最後では未サポートの機能とロードマップについて触れている。

[レポート]AWS Graviton2(Arm64)で.NET 6のパフォーマンスを加速させる #XNT303 #reinvent | DevelopersIO

https://dev.classmethod.jp/articles/reinvent-2021-report-xnt303/

AWS re:Invent 2021 のセッション Accelerate .NET 6 performance with Arm64 on AWS Graviton2 のレポート記事。

Entity Framework Biweekly Status Updates (2021) · Issue #23884 · dotnet/efcore

https://github.com/dotnet/efcore/issues/23884#issuecomment-984797885

Entity Framework の隔週のステータスアップデートまとめ。

EF Core 7.0 のプランが近いうちにレビューされ公開される予定、品質向上のための作業が 6.0.2 に向けて進んでいる、など。

.NET6 が起動するまでのコードを追ってみよう - Qiita

https://qiita.com/up-hash/items/87e98261bb026298f207

.NET 6 においてアプリケーションが起動するまで(エントリーポイントが呼び出されるまで)の流れを追った .NET ランタイムホストについての解説記事。

実際にアプリケーションが起動するまでの流れをソースコードと合わせながら解説している。

How Rider Hot Reload Works Under the Hood | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/12/02/how-rider-hot-reload-works-under-the-hood/

Rider のホットリロードが裏側で何をしているのかということを解説している記事。

Apply Changes を押した際に Roslyn から差分を受け取っていること、.NET 6 ではホットリロードのためのエージェントを読み込ませていて適用する仕組みになっているなど。

.NET Conf 2021 Recap - Videos, Slides, Demos, and More

https://devblogs.microsoft.com/dotnet/net-conf-2021-recap-videos-slides-demos-and-more/

.NET Conf 2021 のまとめ記事。

Microsoft.Maui.Graphics でクロスプラットフォームレンダリングしてみる

https://zenn.dev/tan_y/articles/ee413cce02de17

System.Drawing.Common の代わりとなる Microsoft.Maui.Graphics についての記事。

記事では Windows Forms, WinUI, MAUI と異なるプラットフォーム/バックエンドで試してみた結果などもあげている。

I show you how to Crack a .NET Application

https://medium.com/dotnetsafer/i-show-you-how-to-crack-a-net-application-f88ed2598f97

.NET アプリケーションをクラック(デコンパイルと書き換え)する方法についての記事。

.NET アプリケーションに対しての解析と書き換えをはじめとして、Blazor や Xamarin (Android) アプリケーションに関しても触れている。

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

GitHub - dotnet/jitutils

https://github.com/dotnet/jitutils

.NET ランタイムの JIT を開発する人向けのツール集。

GitHub - pakrym/jab: C# Source Generator based dependency injection container implementation.

https://github.com/pakrym/jab

C# Source Generator を使用した Dependency Injection コンテナーのライブラリー。

コンパイル時に確定できることでスタートアップや解決時のパフォーマンスを大きく改善できるとのこと。

microsoft/dotnet-podcasts: .NET 6 reference application shown at .NET Conf 2021 featuring ASP.NET Core, Blazor, .NET MAUI, Microservices, and more!

https://github.com/microsoft/dotnet-podcasts

.NET Conf 2021 で公開された .NET 6 のリファレンスアプリケーション。ASP.NET Core, Blazor, MAUI, マイクロサービスといった要素で構成されている。

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

ツイート

Rider 2021.3 では asmdef のパワフルな補完がついてくるという話。インストール済みのパッケージや有効になっているシンボル定数のハイライト、シンボル定数名の補完など。

DOTNET_NEW_PREFERRED_LANG 環境変数を設定しておくと、新しいプロジェクトを作るときにその言語をデフォルトで使用できるという話。

Visual Studio のウォッチウィンドウでは IntelliSense も使用でき、今ではラムダ式なども書けるのでデバッグ時のイミディエイトウィンドウや評価ウィンドウなどの代わりに使えるというテクニック。

ちなみにウォッチウィンドウは Non-public なメンバーも IntelliSense には出てこないものの指定すると表示できる。(obj._privateMemberのように)

Deep Dive

[API Proposal]: Support for MultiSet & MultiMap in System.Collections.Generic · Issue #61892 · dotnet/runtime

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

一つのキーで複数の値が持てる MultiSet や MultiMap が欲しいという提案。やりたいこととしては次のようなことが挙げられている。

var c = new MultiSet<int>();
c.Add(42);
c.Add(42);
Console.WriteLine(c[42]); // => 2

これに対して .NET 6 であれば MultiSet に関しては CollectionMarshal と Dictionary で完結できるので十分ではなど。

var counts = new Dictionary<string, int>();
foreach (string input in source)
{
    CollectionsMarshal.GetValueRefOrAddDefault(counts, input, out _)++;
}

Support unloadability in DispatchProxy. by teo-tsirpanis · Pull Request #62095 · dotnet/runtime

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

DispatchProxy で生成したアセンブリをアンロードできるようにするという PR。

[Proposal]: Roles and extensions · Issue #5497 · dotnet/csharplang

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

既存の型に関する拡張の roles と extensions の提案。

Remove razor-compiler from aspnetcore by pranavkm · Pull Request #38706 · dotnet/aspnetcore

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

Razor のコンパイラーが ASP.NET Core のリポジトリーから分離されたため削除した PR。

🎅 🎄 Happy Holidays, everyone! Responses for issues may be delayed till early January · Issue #38711 · dotnet/aspnetcore

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

ホリデーシーズンということでチームのメンバーがお休みしていることもあり、Issue や PR、コメントが来年まで遅れるかもしれないという話。