2021-10-15: .NET 6 RC2, Visual Studio 2022 RC2 & Preview 5, .NET 5.0.11, ReSharper/Rider 2021.3 EAP

Published on Friday, 15 October 2021

.NET 6 Release Candidate 2 (RC2) がリリースされました。

それに合わせて ASP.NET Core, MAUI, EF Core もアップデートされ、Visual Studio 2022 も RC と Preview 5 がリリースされています。RC ということもあり新機能はあまりなく、バグ修正がメインのリリースとなっています。

Visual Studio 2022 は今回から RC (リリース) と Preview でチャンネルが分かれました。RC は General Availability (GA) つまり製品版がリリースされたのち製品版へとアップデートされ、Preview チャンネルはそのまま Visual Studio 2022 の次期 Preview 版 (17.1 Preview) へと更新されるという違いがあります。

以前より11月9日の .NET Conf で .NET 6 がローンチされるということがアナウンスされていましたが、Visual Studio 2022 のオンラインローンチイベントも11月8日(日本時間では11月9日)に行われることもアナウンスされました。(Visual Studio 2022 に .NET 6 がついてくることを考えると、.NET 6 の実質的なリリース日はそちらになるのでしょうか…)。

ASP.NET Core の Blazor WebAssembly にはネイティブ依存関係のサポートが入りました。これは Emscripten でコンパイルされたネイティブコードを C# から呼び出せるようになる仕組みです。WASM でコンパイルできる C/C++ などのライブラリーを C# から呼び出すといったことができるようになるので、できることが増えそうです。


.NET 5.0.11 と 3.1.20 がリリースされました。

バグ修正とセキュリティー修正が行われています。セキュリティーに関しては Linux および macOS での System.DirectoryServices.Protocols.LdapConnection で機密情報がプレーンテキストで送信されてしまうという問題が修正されています。


ReSharper と Rider の 2021.3 EAP4 がリリースされました。

ReSherper はコードフォーマットの改善と dotTrace のタイムラインを開く操作やフィルター操作が高速化しました。Rider はフォーマッティングの設定や EditorBrowsable のサポート追加、Unity とXamarin のサポート強化が行われています。

トピックス

Announcing .NET 6 Release Candidate 2

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

.NET 6 Release Candidate 2 (RC2) がリリースされ、合わせて Visual Studio 2022 RC および Preview 5 もリリースされた。

11月9日の .NET Conf で .NET 6 がローンチされ、前日の11月8日(日本時間では11月9日)にVisual Studio 2022 のオンラインローンチイベントが行われることもアナウンスされた。

.NET 6 は Visual Studio 2022 をサポートし、Visual Studio 2019 をサポートしないことにも触れている。なお Visual Studio は RC (リリース) と Preview でチャンネルが分かれ、RC は General Availability (GA) 時には製品版へとアップデートされ、Preview チャンネルは次期 Preview 版 (17.1 Preview) へと更新される。

前回 (RC1) の記事では .NET の基礎機能について触れていたが、今回の記事では C# 10 とテンプレートについてと ARM64 対応について触れている。

C# 10 については record structglobal using、ファイルスコープ 名前空間、const と文字列補完の強化、拡張プロパティーパターンについてなど。

プロジェクトテンプレートについては新しいコンソール、Web、Windows Forms 向けに生成されるものについて。その他、暗黙の using と Nullable reference types の有効化、コマンドライン引数が args としてアクセス可能といった点に触れている。

ARM64 の対応については 2021/10/08 のトピックスで触れたものと同様のアナウンスがされている。

  • x64 版と ARM64 版のインストールの共存可能になる
  • .NET 6 RC2 以降では一度すべての .NET をアンインストールする必要がある
  • コマンドラインから ARM64 のコマンドを使用して x64 の開発が行える (逆も)
  • パフォーマンス上の理由からも ARM64 SDK を使用してほしい
  • SDK は .NET 6+ の ARM64 のみをサポートする
  • ランタイムはすべてのバージョンの ARM64, x64 共にサポートする
  • .NET 6 RC2 で x64 エミュレーションも含む ARM64 の .NET 6 体験を提供
  • .NET Core 3.1, .NET 5 のランタイムも .NET 6 に合わせて更新予定 (ただし時期は未定)
  • RC2 ナイトリービルドは現在壊れているため数週間後にリリースされる RC2 を待ってほしい
  • .NET 5 SDK for Windows ARM64 は .NET 6 RTM 後に早期終了予定

.NET 6 がリリース後は .NET 5 SDK のサポートが終了することに注意が必要。

Visual Studio 2022 for Mac Preview 2 is now available

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

Visual Studio 2022 for Mac Preview 2 がリリースされた。

.NET 6 RC2 への対応と UI の修正やネイティブ化が進んだ。.NET 6 RC2 は手動でインストールが必要。現時点では Intel 環境のみのサポートで M1 (Apple Silicon) 環境での動作はサポートしていないことに注意。

ASP.NET Core updates in .NET 6 Release Candidate 2

https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-rc-2/

.NET 6 RC2 での ASP.NET Core のアップデートについての記事。

既存のプロジェクトのアップデート方法や、Blazor WebAssembly のネイティブ依存関係のサポートとその呼び出し、Minimal API の強化について触れている。

Blazor WebAssembly のネイティブ依存関係のサポートは ネイティブコードを .NET WebAssembly ビルドツール (Emscripten) でリンクすることで .NET WebAssembly から P/Invoke で呼び出すことが可能となるもの。記事では C のソースコードを作成し、それをプロジェクトに含めてビルドし、C# から呼び出す例が掲載されている。依存として使用できるものは C/C++ のソースコードと事前に Emscripten によってコンパイルされている .a, .o, .bc, .wasm といったファイル。

また、ネイティブ依存関係を NuGet パッケージにパッケージングする方法や SkiaSharp を例に既に WebAssembly がパッケージングされたものを使用する方法についても触れている。

Minimal API の強化についてはパラメータバインディングと OpenAPI 対応、アナライザーの追加などが行われた。パラメータバインディングは TryParseBindAsync という名前の静的メソッドをバインド対象の型に定義することで呼び出される仕組みとなっている。

Announcing .NET MAUI Preview 9

https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-9/

.NET MAUI Preview 9 がリリースされた。

BoxView, IndicatorView, ImageButton, WebView といったコントロールの実装が更新された。

Border コントロールが新たに導入され、角丸を含むボーダーを描画できるようになった。またレイアウトや画像などのコントロールに影をつける Shadow も導入された。

Android においてスタートアップ部分のトレーシングを行うことで部分的に AOT を行い、スタートアップのパフォーマンスを改善するプロファイルが追加された。通常の AOT ではアプリケーション全体をコンパイルするため、パフォーマンスは改善される反面アプリケーションサイズが肥大化してしまう問題があり、スタートアップトレーシングではそのバランスをとることができる。

Release EF Core 6.0 RC2 · dotnet/efcore

https://github.com/dotnet/efcore/releases/tag/v6.0.0-rc.2.21480.5

Entity Framework Core 6.0 RC2 がリリースされた。

RC1 の時点でほぼ feature complete となっていたため、バグ修正が主な変更内容となっている。一点 RC1 時点で積み残しであったカラムの並びを Column 属性で指定する機能が含まれている。

.NET October 2021 Updates – 5.0.11 and 3.1.20

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

.NET 5.0.11 と 3.1.20 がリリースされた。

バグ修正とセキュリティー対応が行われ、Linux および macOS での System.DirectoryServices.Protocols.LdapConnection で機密情報がプレーンテキストで送信されてしまうという問題が修正された。

ReSharper 2021.3 EAP4 / Rider 2021.3 EAP4

ReSharper と Rider の 2021.3 EAP4 がリリースされた。

ReSherper はコードフォーマットの改善と dotTrace のタイムラインを開く操作やフィルター操作が高速化。

Rider はフォーマッティングの設定や EditorBrowsable のサポート追加、Unity の外部パッケージに含まれるファイルの取り扱いや .asmdef のサポート強化、Xamarin の Android レイアウトエディターの強化や AndroidX ライブラリーのサポート強化など。

ReSharper 2021.2.2 and Rider 2021.2.2 bug fixes have landed | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/10/13/resharper-and-rider-2021-2-2/

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

それぞれバグ修正がメインのリリース。ReSharper では C# 10 の const を使用した文字列補完、Rider ではビルトインのコンソールに関する問題が修正された。

Release 0.10.8 · AvaloniaUI/Avalonia

https://github.com/AvaloniaUI/Avalonia/releases/tag/0.10.8

Avalonia 0.10.8 がリリースされた。

タスクトレイアイコンサポートやマスクされたテキストボックスの追加、様々なバグ修正が行われている。

Cake - Cake v1.3.0 released

https://cakebuild.net/blog/2021/10/cake-v1.3.0-released

Cake 1.3.0 がリリースされた。

.NET 6 のサポートや Visual Studio 2022、MSBuild 17 への対応が含まれている。その他終了コードを指定してビルドプロセスを終了させる機能やディレクトリが存在する場合に削除する EnsureDirectoryDoesNotExist の追加など。

Release ILSpy 7.2 Preview 1 · icsharpcode/ILSpy

https://github.com/icsharpcode/ILSpy/releases/tag/v7.2-preview1

ILSpy 7.2 Preview 1 がリリースされた。

Roslyn 3.11 に合わせたパターン検出、C# 7.0 のパターンマッチングと C# 9 の共変戻り値のサポート、その他修正や機能強化がふくまれる。

A preview of WSL in the Microsoft Store is now available! - Windows Command Line

https://devblogs.microsoft.com/commandline/a-preview-of-wsl-in-the-microsoft-store-is-now-available/

WSL のプレビュー版が Microsoft Store からインストール可能となった。

現在の WSL は Windows の機能としてインストールする形だが、WSL のプレビュー版は Microsoft Store から提供される。これにより Windows のアップデートに依存せず WSL の更新が行えるようになるため、新機能の提供サイクルを早められるとしている。将来的には WSL のインストールは Microsoft Store からにしたいとのこと。

現在のプレビューでは WSLg や VHD のマウント、カーネルアップデートなどが含まれている。

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

dotnet centralized package versioning

https://dev.to/kritner/dotnet-centralized-package-versioning-4i41

NuGet パッケージのバージョンを一か所 (Directory.Packages.props) に定義することで、リポジトリワイドでパッケージのバージョンを統一する <ManagePackageVersionsCentrally> についての記事。

プレビューな機能ではあるが Directory.Packages.props を作成して、プロジェクト側に <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> を指定することで使用できる。

SpanとかMemoryとかIntPtrとかArrayの変換方法チートシート - Qiita

https://qiita.com/kenichiuda/items/510a3443181e3602e2eb

Span や Memory, IntPtr や配列といったものを相互で変換する方法についてのチートシート。

Prime your flux capacitor: SQL Server temporal tables in EF Core 6.0

https://devblogs.microsoft.com/dotnet/prime-your-flux-capacitor-sql-server-temporal-tables-in-ef-core-6-0/

Entity Framework Core 6.0 でサポートされた、SQL Server のテンポラル テーブル (バージョニング) を扱うことについての記事。

.NET 6 で動的にコンポーネントをレンダリングする機能が追加されたので試してみる

https://zenn.dev/okazuki/articles/blazor-dynamic-component

.NET 6 の Blazor で追加された、型を指定して動的にコンポーネントをレンダリングする DynamicComponent コンポーネントについての記事。

JavaScript equivalent of C# 'out' keyword

https://dev.to/sincovschi/javascript-equivalent-of-c-out-keyword-2l2b

JavaScript を書く際に C# の out キーワードと同じことをするにはどうすればいいかという記事。

例えば TryParse に相当する関数を書くようなケースの書き方。null を返す方法、{ isNumber, number } のようにオブジェクトで返す方法、オブジェクトを渡すことで書き換える方法、他にもトリッキーな方法について触れている。

Dotnet code generation overview by example

https://dev.to/maximtkachenko/dotnet-code-generation-overview-by-example-1m16

簡単なパーサーを例としたコード生成を行う手法についての比較の記事。

IL Emit, Expression Tree, Reflection, Sigil, Roslyn, Source Generator, 手書きといったパターンでのコード例とパーサーの生成時間、呼び出しコストなどの比較をしている。

World's Smallest C# Program (featuring N)

https://nietras.com/2021/10/09/worlds-smallest-csharp-program/

.NET で最小のプログラムはどうなるのかという記事。

結論としては .NET 5 以降と C# 9.0 以降であれば {} の2文字で何もしないプログラムを記述でき、.NET 6 と C# 10 以降であれば N(); という4文字で何かをするプログラムを記述できる。記事ではそれぞれにたどり着くまでの経過と、.NET 6 で何かする N(); を記述できるようになるまでのパッケージ等について書かれている。

Testing ASP.NET Core web applications with WebApplicationFactory - It’s all about tech

https://renatogolia.com/2021/10/11/testing-asp-net-core-web-applications-with-webapplicationfactory/

Bring VS Code themes to Visual Studio 2022! - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/vs-code-themes-in-vs/

Visual Studio Code のテーマを Visual Studio 2022 にコンバートするという記事。

Copy Code Reference in ReSharper and Rider 2021.3 EAP | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/10/11/copy-code-reference-in-resharper-and-rider-2021-3-eap/

ReSharper と Rider 2021.3 EAP に搭載された、コードの参照をコピーする機能についての記事。

コードの参照は FQN (Namespace.Type.Member の形式) や XML ドキュメントの ID でのコピーに加え、カスタムのパターンに展開する方法についても触れている。

Supporting EF Core migrations with WebApplicationBuilder: Exploring .NET Core 6 - Part 5

https://andrewlock.net/exploring-dotnet-6-part-5-supporting-ef-core-tools-with-webapplicationbuilder/

.NET 6 の Entity Framework Core のマイグレーションをはじめとするツールが IServiceProvider を取得する流れについての記事。

WebApplicationBuilder のような Minimal API に対応するために、DiagnosticSource を駆使して IHost の生成をとらえているといった話。

Reading AsyncLocal values from a memory dump

https://kevingosse.medium.com/reading-asynclocal-values-from-a-memory-dump-8be356a46b29

AsyncLocal<T> が内部ではどのように格納されているのかについての記事。

実際にメモリーダンプを取って WinDbg で読み取る方法や ClrMD で読み取ってみるといったことをしている。

Refactor Functional Tests to support Minimal Web APIs

https://dev.to/this-is-learning/refactor-functional-tests-to-support-minimal-web-apis-4p2e

Minimal API を使用した ASP.NET Core アプリのファンクショナルテストを行う方法についての記事。

Try out .NET 6 inside your own development environment built with devcontainers, docker, and vscode

https://dev.to/nikiforovall/try-out-net-6-inside-your-own-development-environment-built-with-devcontainers-docker-and-vscode-4fe4

Visual Studio Code の Devcontainer を使って .NET 6 を試すという記事。

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

GitHub - jpobst/classic-dotnet-templates: .NET 6+ project templates that do not use top level statements

https://github.com/jpobst/classic-dotnet-templates

.NET 6 向けの Top-level Statements を使用しない、昔ながらのプロジェクトを作成するテンプレート。

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

InternalsVisibleTo - MSBuild プロジェクトの共通項目 - MSBuild

https://docs.microsoft.com/ja-jp/visualstudio/msbuild/common-msbuild-project-items?view=vs-2019#internalsvisibleto

.NET Core または .NET 5 SDK のプロジェクトでは InternalsVisibleTo をプロジェクトに定義することでビルド時にアセンブリの属性を出力する。

<ItemGroup>
    <InternalsVisibleTo Include="Nantoka.Test" />
</ItemGroup>

performance/microbenchmark-design-guidelines.md at main · dotnet/performance

https://github.com/dotnet/performance/blob/main/docs/microbenchmark-design-guidelines.md

.NET ランタイムのマイクロベンチマークのガイドライン。

Carbon

https://carbon.now.sh/

ソースコードを画像にしてシェアできるサービス。

carbon

ツイート

メモリーオーダーリングの違いで M1 の Rosetta (x64 エミュレーション) のほうが M1 (arm64) ネイティブよりも速くなってしまうケースがあるという話。

.NET 6 で導入された Nullability を取得する Reflection API について。

ImageSharp は V2 をリリースしたのち V3 にフォーカスし、レガシーフレームワークのサポートを削除する予定 (.NET Core 3.1 が最低ライン) とのこと。

DevDiv でハッカソンをやっているという話。実際幾つかのリポジトリにハッカソンのようなブランチとその PR が上がっているのでそのことのよう。Spec がないようなものもあり、デモ用のブランチにマージされているので PoC を兼ねている模様。

Deep Dive

Add simpler way to get the "old style" console templates · Issue #3985 · dotnet/templating

https://github.com/dotnet/templating/issues/3985

.NET 5 とそれ以前のスタイルのコンソールアプリケーションテンプレートを使いたいという話の Issue。現時点では .NET 6 GA にそのようなものは含めるつもりはないとのこと。

File.AllText optimizations by adamsitnik · Pull Request #58167 · dotnet/runtime

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

File.*AllText* メソッドの実装を最適化することでメモリーアロケーションと処理時間を削減するという PR。StreamWriter/FileStream を介さないようにすることでメモリーの削減、大き目のバッファの確保とファイルシステムの事前アロケーションによって CPU 負荷を削減。

Add support for non-seekable files to RandomAccess by adamsitnik · Pull Request #58506 · dotnet/runtime

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

シークできないハンドル(ネットワークや名前付きパイプなど)に対して RandomAccess クラスの Write/Read を使用できるようにする PR (なぜかクローズされた)。

PlaintextMVC benchmark is slow on arm64 · Issue #60166 · dotnet/runtime

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

ARM64 の PlaintextMVC ベンチマーク(とその他ベンチマーク)が x64 に比べて遅いという Issue。プロセッサーのキャッシュサイズによって決まる Gen0 のサイズによって GC が影響を受けているといった話。

"is new()" crashes csc.exe · Issue #57088 · dotnet/roslyn

https://github.com/dotnet/roslyn/issues/57088

T is new() で C# コンパイラーがクラッシュするという Issue (Visual Studio もエラーを吐く)。17.1 で修正される可能性がある。

void Foo<T>()
{
    if (T is new ())
    { }
}

How to properly benchmark FileStream.Write vs WriteFile? · Issue #60268 · dotnet/runtime

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

Win32 API の WriteFileFileStream.Write では FileStream.Write のほうが遅い、という話が元々の Issue。

コメントで BenchmarkDotNet でこうすると良いし、その結果特に遅くないという結果が出たため件名が変更された。他にも Issue を立てた人のシナリオであれば .NET 6 で Preallocaiton を使用したり、バッファリングをオフにすると良いといった話も。

Make upgrade install new host first, then uninstall old by ericstj · Pull Request #60307 · dotnet/runtime

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

dotnet コマンドへのパスは PATH の後ろに追加されるため、x86 と x64 の SDK がインストールされたような環境でアップグレードインストールすると x86 のものが残り、x64 環境においても x86 版が使用されてしまう問題。

lateapexearlyspeed-issue-30778 Create method: TryReadExact(). by lateapexearlyspeed · Pull Request #57921 · dotnet/runtime

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

SequenceReader<T> に指定したサイズを読むことを試みる TryReadExact を追加する PR。.NET 7 に入る予定。

Implement IAsyncEnumerable<T>.ToBlockingEnumerable by eiriktsarpalis · Pull Request #60363 · dotnet/runtime

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

IAsyncEnumerable<T> をブロッキングな IEnumerable<T> に変換する拡張メソッドの追加 PR と提案 Issue。