.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 もリリースされた。
- [お知らせ] Visual Studio 2022 のローンチが決定しました(日本時間 11/9 1:30 にオンラインイベントで発表)※随時アップデート予定 - Qiita
- Visual Studio 2022 のローンチ イベント - Visual Studio
- Join us November 8 for the Launch of Visual Studio 2022
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 struct
、global 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) 環境での動作はサポートしていないことに注意。
- Visual Studio 2022 for Mac の Public Preview 2 がリリースされました - Qiita
- Visual Studio 2022 for Mac v17.0 Preview - Release Notes
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 対応、アナライザーの追加などが行われた。パラメータバインディングは TryParse
と BindAsync
という名前の静的メソッドをバインド対象の型に定義することで呼び出される仕組みとなっている。
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.3 EAP4 brings new formatting settings and better performance in dotTrace Timeline snapshots. Read more here: https://t.co/SdZYUC5gcf pic.twitter.com/7QXNS33sJe
— JetBrains ReSharper (@resharper) October 14, 2021
Rider 2021.3 EAP4 is out with new Code Vision metrics and updates for Unity, Xamarin, the debugger, and environment configuration. Learn more and download it here: https://t.co/2dPfI9RjQI pic.twitter.com/cdgNEShjxQ
— JetBrains Rider (@JetBrainsRider) October 14, 2021
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
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
.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
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
.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
ソースコードを画像にしてシェアできるサービス。
ツイート
This .NET benchmark is 4x faster on M1 Rosetta (x64 emulation) then on the same M1 but natively (arm64) 🙃 pic.twitter.com/9gr8kt9Zth
— Egor Bogatov (@EgorBo) October 10, 2021
メモリーオーダーリングの違いで M1 の Rosetta (x64 エミュレーション) のほうが M1 (arm64) ネイティブよりも速くなってしまうケースがあるという話。
.NET 6 introduces a new Reflection API for nullability information.
— Oleg Kyrylchuk (@okyrylchuk) October 9, 2021
It provides nullability information and context from reflection members:
• ParameterInfo
• FieldInfo
• PropertyInfo
• EventInfo#dotnet6 #coding #devcommunity #reflection pic.twitter.com/GbW3uIHIBF
.NET 6 で導入された Nullability を取得する Reflection API について。
Really looking forward to the coming year of working on ImageSharp. Once we ship V2 which will include some awesome features and performance improvements the focus will switch immediately to V3 which will drop all the legacy target frameworks.
— JimBobSquarePants (@James_M_South) October 10, 2021
ImageSharp は V2 をリリースしたのち V3 にフォーカスし、レガシーフレームワークのサポートを削除する予定 (.NET Core 3.1 が最低ライン) とのこと。
Our DevDiv friends have been going absolutely crazy this hackaton! This stuff is now checked in (not in main):
— Sergio Pedri (@SergioPedri) October 13, 2021
- stackalloc for all Ts
- Constant ReadOnlySpan<T> for all primitives
- ref fields (!)
- Generic *everything* (!!)
- refs to refs
Don't wake me up now 🚀#csharp #dotnet
DevDiv でハッカソンをやっているという話。実際幾つかのリポジトリにハッカソンのようなブランチとその PR が上がっているのでそのことのよう。Spec がないようなものもあり、デモ用のブランチにマージされているので PoC を兼ねている模様。
- Support params SpanT by cston · Pull Request #57104 · dotnet/roslyn
- RuntimeHelpers.CreateSpan optimization for stackalloc by svick · Pull Request #57123 · dotnet/roslyn
- Support 'ref' type arguments in delegates by RikkiGibson · Pull Request #57135 · dotnet/roslyn
- Checkin the work for coreclr around stackalloc, ref fields and arbitrary generics to hackathon tree by davidwrighton · Pull Request #60303 · dotnet/runtime
- Constraint generic work by davidwrighton · Pull Request #60320 · dotnet/runtime
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 の WriteFile
と FileStream.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 版が使用されてしまう問題。
- [Known Issue] Installing VS2022 Preview 5.0 and/or .NET 6.0 RC2 results in x86 dotnet on the PATH · Issue #22047 · dotnet/sdk
- [release/6.0] Make upgrade install new host first, then uninstall old by github-actions[bot] · Pull Request #60317 · dotnet/runtime
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。