今年も 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 配下へと移管された。
- dotnet/ClangSharp: Clang bindings for .NET and Mono written in C#
- dotnet/LLVMSharp: LLVM bindings for .NET Standard written in C# using ClangSharp
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
.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.
C# Source Generator を使用した Dependency Injection コンテナーのライブラリー。
コンパイル時に確定できることでスタートアップや解決時のパフォーマンスを大きく改善できるとのこと。
A new version of Jab compile-time Dependency Injection is out! Now with incremental compilation support and other fixes. https://t.co/Va7PV6fUVL
— Pavel Krymets (@pakrym) November 27, 2021
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, マイクロサービスといった要素で構成されている。
サイト、ドキュメントなど
ツイート
This is a great tip. And Rider 2021.3 (coming soon!) will help editing the .asmdef file! Shows version of the installed package, and highlights when a condition isn't met. Also gives package completion, define symbol completion + validation, and… (1/2) https://t.co/z1qSWQpCee pic.twitter.com/9OuFZkqw3K
— Matt Ellis (@citizenmatt) November 26, 2021
Rider 2021.3 では asmdef のパワフルな補完がついてくるという話。インストール済みのパッケージや有効になっているシンボル定数のハイライト、シンボル定数名の補完など。
Daily #TemplateTip number 2:
— Sayed I. Hashimi #BlackLivesMatter (@sayedihashimi) December 2, 2021
If you use some language besides C# for most projects, you can configure the default lang for projects created in dotnet new with the env var: DOTNET_NEW_PREFERRED_LANG
Take a look after I set that to F#, I get F# projects by default. pic.twitter.com/uIP1ssIHsU
DOTNET_NEW_PREFERRED_LANG
環境変数を設定しておくと、新しいプロジェクトを作るときにその言語をデフォルトで使用できるという話。
私がよくやるのはウォッチウィンドウプログラミング。結果も確認しやすいし、式の再利用/再評価もしやすいので、これがあればEvaluate WindowもImmediate Windowもいらない。 pic.twitter.com/Ek3doORDZa
— neuecc (@neuecc) December 1, 2021
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、コメントが来年まで遅れるかもしれないという話。