2021-10-22: Visual Studio 2022 RC2, LINQPad 7 Beta, Hot Reload, F# 6

Published on Friday, 22 October 2021

Visual Studio 2022 version 17.0 RC2 and Preview 6 がリリースされました。

.NET 自体の更新はなく Visual Studio のバグ修正が主な更新点です。何か不具合のようなものを踏んでいる方は更新をおすすめします。


LINQPad 7 Beta がリリースされました。

.NET 6 および C# 10 に対応し、ARM64 向けのバイナリーも含まれるようになりました。Surface Pro X のような ARM 版 Windows でも C# を書いて ARM ネイティブで動かせるようになりました。現在 6 のライセンスは無償アップグレードとなっていて、既にライセンスを持っている人でも割引で購入できるようになっています。


ホットリロードについてのステータスアップデートがアナウンスされました。

アナウンスでは Visual Studio とターゲットフレームワークによる対応具合や MAUI/ASP.NET での対応についても書かれていますが、地味に大きな点としては dotnet watch をリリースしないという決定がなされたという点です。特に Visual Studio を使用していない開発者がホットリロードの恩恵を受けられなくなるということで大きな反響が生まれています。

元々バギーではあったのですが .NET 6 の目玉機能かつ RC2 をリリースした後、GA までもう少しという直前の段階で削除をしてリリースしないというアナウンスをしたので余計に不満になっていそうです。今後何らかの形で戻されたりする可能性は十分あるのではないかと思います。

トピックス

Visual Studio 2022 version 17.0 RC2 and Preview 6

https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes-preview#1700-pre60--visual-studio-2022-version-170-rc2-and-preview-6-newreleasebutton

Visual Studio 2022 version 17.0 RC2 と Preview 6 がリリースされた。

RC と Preview 5 のリリースからの Visual Studio 固有のバグ修正が行われており、.NET 6 SDK などへの変更はない。

LINQPad 7 Beta

https://www.linqpad.net/LINQPad7.aspx

LINQPad 7 Beta がリリースされた。

LINQPad 7 は .NET 6 および C# 10 に対応したリリースとなり、.NET 6, .NET 5, .NET Core 3.1, .NET Framework をサポートする。 また ARM64 ビルドも提供され Surface Pro X をはじめとする ARM64 環境でのネイティブ動作が可能となった。

正式なリリースは .NET 6 のリリース後となり、現在 LINQPad 6 のライセンスを購入することでリリース時にアップグレードが可能。

Update on .NET Hot Reload progress and Visual Studio 2022 Highlights

https://devblogs.microsoft.com/dotnet/update-on-net-hot-reload-progress-and-visual-studio-2022-highlights/

.NET のホットリロードについてのアップデートの記事。

記事では次のようなトピックについて書かれている。

  • サポートされるフレームワークとシナリオ
  • Visual Studio 2022 での体験の向上
  • MAUI と ASP.NET でのシナリオ
  • .NET アプリの編集に関する追加サポート
  • .NET 6 ユニットテストのホットリロード (Experimental)
  • dotnet watch コマンドラインツールに関する変更

サポートされるフレームワークとシナリオについては Visual Studio 2022 からデバッガーを使用しているかそうでないか、Visual Studio 2022 と .NET 6 をターゲットとしたアプリかどうかといった場合について書かれている。大まかには従来のフレームワークをターゲットとしている場合にはデバッグ時のみ、.NET 6 をターゲットとしている場合はデバッガーなしも含め殆どのケースでサポートされる。

ただし Blazor WebAssembly は GA の時点では対応されず、他に対応しないシナリオとして iOS と Android の Xamarin.Forms や F# アプリケーション、.NET Native アプリケーションなどがあるとのこと。

Visual Studio 2022 での体験の向上は、ラベルが Hot Reload となったこと、ファイル保存時にホットリロードする機能が付いたことなどがあげられている。

MAUI と ASP.NET でのシナリオは MAUI (iOS/Android) でのホットリロードが可能になること、ASP.NET では Razor CSHTML の変更と自動リロード、CSS のホットリロードなどが可能となった。ただし MAUI のホットリロードは Mono ランタイムの制限上メソッドボディーの編集に限られるとのこと。

その他 XAML のホットリロードとユニットテスト実行時のホットリロードがプレビュー(オプトイン)で提供されていることについて。

最後に dotnet watch コマンドラインツールについて、ホットリロードは開発の集中のため Visual Studio 2022 でのみの提供となり、コマンドラインツールはリリースしないと決定したとのこと。Visual Studio 2022 for Mac に関しては将来のリリースで追加する予定。

これに伴い dotnet watch が削除されたが、Visual Studio Code や Rider といった Visual Studio 以外のユーザーからは不満の声が上がっているので今後何らか動きがある可能性がある。

What’s new in F# 6

https://devblogs.microsoft.com/dotnet/whats-new-in-fsharp-6/

.NET 6 に含まれる F# 6 についての記事。

F# で速くなった点、均一化された点、シンプルになった点、ツーリングの改善などについて触れている。

Introducing new JavaScript Engine YantraJS for DotNet

https://www.webatoms.in/blog/yantra-js/Introducing-new-JavaScript-Engine-YantraJS-for-DotNet-2g

オープンソースの JavaScript エンジンの YantraJS がリリースされた。

.NET との相互運用や JavaScript を .NET のアセンブリーに変換するコンパイラーなどが提供されることが特徴。 現時点で ECMAScript 6 の適合率は70%程度で今後100%を目指すとのこと。その他 V8 Debugger Protocol のサポートなどが今後のロードマップにあがっている。

ライセンスは LGPL、YantraJS Standard License (主にサーバーサイド利用目的)、YantraJS Enterprise License となっている。MIT ライセンスに変更できるようスポンサーも求めているとのこと。(ただ LGPL 版を NuGet で参照した場合でもソースコードを公開する必要があると書かれているので LGPL ではない可能性がある)

We've upgraded the UI in Visual Studio 2022

https://devblogs.microsoft.com/visualstudio/weve-upgraded-the-ui-in-visual-studio-2022/

Visual Studio 2022 における UI の変更についての記事。

一貫性や視認性、親しみやすさを考慮したアイコンの刷新、ダークモードでのコントラスト調整や新しいアクセントカラー、Cascadia フォントの導入などについて触れている。

Contributing to .NET MAUI Community Toolkit

https://devblogs.microsoft.com/dotnet/contributing-to-net-maui-community-toolkit/

.NET MAUI Community Toolkit にコントリビュートする方法についての記事。

.NET MAUI Community Toolkit がコミュニティーのコントリビュートを受け入れるようになり、新機能を提案したい場合のフローについて解説している。 フローは C# チームのものを参考にしたものとなっている。

  • Discussion をオープン
  • フィーチャーの Proposal (Issue) をオープン
  • チームによって Champion を選出
  • .NET MAUI Community Toolkit Monthly Standup (YouTube 配信) で投票の上、承認
  • Pull Request 承認
  • ドキュメント承認

承認された Proposal は help wanted ラベルがつけられるため、簡単なコントリビュートとしてはこの実装を提供する(Pull Request)という方法も提示されている。

Release 2.0.0-beta.5 · mysql-net/MySqlConnector

https://github.com/mysql-net/MySqlConnector/releases/tag/2.0.0-beta.5

Async MySQL Connector 2.0.0-beta.5 がリリースされた。

変更点は ActivitySource によるトレースへの対応。今回のリリースよりバージョニングが 1.4.0 ベータでの変更範囲を鑑みて 2.0 へと変更された。

Release 1.3.14 · mysql-net/MySqlConnector

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

Async MySQL Connector 1.3.14 がリリースされた。

バグ修正が主な変更となっている。

Release EF Core 3.1.20 · dotnet/efcore

https://github.com/dotnet/efcore/releases/tag/v3.1.20

Entity Framework Core 3.1.20 がリリースされた。

SQLite の不具合対応に伴い、依存しているバージョンが 2.0.2 から 2.0.4 へアップデートされた。

Release Diagnostics Release - v5.0.251802 · dotnet/diagnostics

https://github.com/dotnet/diagnostics/releases/tag/v5.0.251802

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

dotnet-dumpdotnet-sos は Linux と Windows 上でのシングルファイルアプリケーションのプロセスとファイルの解析がサポートされた。その他バグ修正など。

Developing for Windows with the Windows App SDK · Discussion #1615 · microsoft/WindowsAppSDK

https://github.com/microsoft/WindowsAppSDK/discussions/1615

Windows App SDK と WinUI 3 の開発についての FAQ。

今後 UWP はバグや信頼性に関連する修正のみが行われ、Windows App SDK を使用する場合には新しいデスクトッププロジェクトに移行する必要があること、といった点など。

.NET Framework October 2021 Security and Quality Rollup

https://devblogs.microsoft.com/dotnet/net-framework-october-2021-security-and-quality-rollup/

.NET Framework の2021年10月のセキュリティーと累積アップデートについて。

セキュリティーに関する更新はなく、正しくない GC の設定によるパフォーマンスの低下や GC.AddMemoryPressure での GC トリガーのアルゴリズムの調整などが含まれている。

BouncyCastle C# 1.9.0

https://www.bouncycastle.org/csharp/index.html#DOWNLOAD1900

BouncyCastle C# 1.9.0 がリリースされた。

TLS API の更新や Format Preserving Encryption、ParallelHash と TupleHash、ARIA cipher のサポートが追加された。バグ修正も行われている。

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

.NET 6 で追加されるタスクベースの新しいタイマー - Qiita

https://qiita.com/karuakun/items/677b2e58260634d86d0d

.NET 6 で追加されたタスクベースとなる新しいタイマーの使い方とそれ以前のタイマーについての記事。

Unity - Improving iteration time on C# script changes

https://forum.unity.com/threads/improving-iteration-time-on-c-script-changes.1184446/

Unity で C# コードを変更したときのドメインリロードの時間が長くなってしまった件についての調査と進捗報告。

リグレッションは 2020.x から発生し、メトリクスの不足や問題が多岐にわたっていること、幾つかの側面から解決を図っていることなど。

例えば 2020.1 以降ではドメインリロードの診断メトリクスを保存する機能が追加されたので利用者が調べることができるようになった。コードベース全体を通してリグレッションを探すタスクフォースを立ち上げ細かく最適化を行うことなど。今後も継続して改善を進め、必要なものはバックポートし、その進捗はスレッドに報告するとのこと。

5 helpful Nuget package for Unit Testing in .NET

https://medium.com/@niteshsinghal85/5-helpful-nuget-package-for-unit-testing-in-net-87c2e087c6d

ユニットテストをするときに役に立つ5つの NuGet パッケージの紹介の記事。

Supporting integration tests with WebApplicationFactory in .NET 6: Exploring .NET Core 6 - Part 6

https://andrewlock.net/exploring-dotnet-6-part-6-supporting-integration-tests-with-webapplicationfactory-in-dotnet-6/

.NET 6 の ASP.NET Core を WebApplicationFactory を使用して統合テストを行うことについての記事。

WebApplicationFactory が内部で行っている処理についても解説している。

Updated Debugging Experience, UWP Apps, and Debug Windows Docker containers in Rider 2021.3 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/10/20/debugging-experience-debug-uwp-apps-and-debug-windows-docker-containers-in-rider-2021-3/

Rider 2021.3 で改善されたデバッグ周りについての記事。

デバッガーの UI の改善や UWP アプリと Windows Docker コンテナーの対応についてなど。

Bite-Size .NET 6 - LINQ OrDefault() Overloads

https://exceptionnotfound.net/bite-size-dotnet-6-linq-ordefault-overloads/

.NET 6 の LINQ の FirstOrDefault のような *OrDefault メソッドにデフォルト値を受けるオーパーロードが追加されたことについての記事。

var name = names.FirstOrDefault("Unknown"); // 見つからなかったら Unknown が返る

Exploring the Auth0 ASP.NET Core Authentication SDK

https://auth0.com/blog/exploring-auth0-aspnet-core-authentication-sdk/

アプリケーションで Auth0 の ASP.NET Core Authentication SDK を使用することについての記事。

gRPC API Performance Improvement Through Protobuf FieldMask In .NET

https://medium.com/@AzilenTech/grpc-api-performance-improvement-through-protobuf-fieldmask-in-net-2dff2af6c959

Protobuf の FieldMask を使用することで gRPC の API パフォーマンスを向上させることについての記事。

必要なフィールドだけを明示して取得することでサーバー側の不要な処理を回避して、メッセージサイズも削減できるというテクニック。

Implement a secure API and a Blazor app in the same ASP.NET Core project with Azure AD authentication

https://damienbod.com/2021/10/04/implement-a-secure-api-and-a-blazor-app-in-the-same-asp-net-core-project-with-azure-ad-authentication/

Blazor WebAssembly と ASP.NET Core Web API に Azure AD 認証を実装する方法についての記事。

Asp Net Core - Rest API Authorization with JWT (Roles Vs Claims Vs Policy) - Step by Step

https://dev.to/moe23/asp-net-core-rest-api-authorization-with-jwt-roles-vs-claims-vs-policy-step-by-step-5bgn

REST API に JWT を使った認可を実装する方法についての記事。

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

davidfowl/IISCrossover: A prototype running ASP.NET and ASP.NET Core in the same IIS pipeline

https://github.com/davidfowl/IISCrossover

IIS で ASP.NET アプリケーション (.NET Framework) と ASP.NET Core アプリケーションを同居させて同じパイプラインで動かすという仕組みのプロトタイプ。

devlooped/ThisAssembly: Exposes project and assembly level information as constants in the ThisAssembly class using source generators powered by Roslyn.

https://github.com/devlooped/ThisAssembly

自身のプロジェクトやアセンブリの情報を取得できるコードを生成する Source Generator。

Console.WriteLine(ThisAssembly.Info.Company); // AssemblyCompanyAttribute

アセンブリの情報だけでなく、定数の定義やメタデータ、プロジェクトのプロパティーにアクセスできるようなものも提供されている。

amis92/csharp-source-generators: A list of C# Source Generators (not necessarily awesome) and associated resources: articles, talks, demos.

https://github.com/amis92/csharp-source-generators

C# Source Generator のまとめリポジトリ。

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

Windows Subsystem for Android™️

https://docs.microsoft.com/en-us/windows/android/wsa/

Windows Subsystem for Android™️ の開発者ドキュメント。考慮すべき点やアプリケーションのデバッグ方法などについて触れている。

Overall migration strategy - Windows apps

https://docs.microsoft.com/en-us/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/overall-migration-strategy

Universal Windows Platform から Windows App SDK へのマイグレーションのガイドドキュメント。

ツイート

非同期処理のデッドロックの発見に Parallel Stacks ビューが便利という話(これは以前のバージョンの Visual Studio にある)。

.NET 6 では暗号論的擬似乱数生成器 (CSPRNG) を使用してランダムなデータを生成するのが RandomNumberGenerator クラスの静的メソッドで簡単に取得できるようになったという話。

Unity 社で C#/.NET の技術グループが立ち上がってスクリプティング (C# や .NET ランタイムの統合)、Burst と VM/IL2CPP チームがまとまって Unity における .NET 技術の推進をしていくという話。今後 exciting news があるとのこと。

ASP.NET Core の .NET 6 まででどのぐらいパフォーマンスが改善されたのかという話のスライドからの抜粋。WebSocket のアロケーションやリクエスト/TLS ハンドシェイクでのアロケーション、ヘッダー周りの高速化などについて。

Deep Dive

DateTime.Now on Linux has wrong timezone · Issue #60469 · dotnet/runtime

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

DateTime.Now が Linux で正しいタイムゾーンを返さないようだという Issue。クローズされているが self-contained な物で発生しているという報告。

Where is the ASP.NET Branding and Logo? · Issue #37550 · dotnet/aspnetcore

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

ASP.NET のブランディングロゴはどこにあるのかという Issue。

現時点では個別のロゴは存在しないがあってもいいのではないかとか、ブランディングのガイドラインではアプリモデルの形では例があり、今後更新していくといった話も。

Experiment with Unsafe.StackAlloc<T> by stephentoub · Pull Request #60428 · dotnet/runtime

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

Hackathon で実装されたスタック上に TSpan<T> を作れる Unsafe.StackAlloc<T> のサンプル利用例の PR。

この PR で見られるように現在の dotnet/runtime では Span<参照型> をスタック上に作成するために次のようなテクニックを使っている。

ThreeMyClasses tmp = default;
Span<MyClass> threeMyClasses = MemoryMarshal.CreateSpan(ref tmp._value1, 3);

ref struct ThreeMyClasses
{
    internal MyClass _value1;
    private MyClass _value2;
    private MyClass _value3;
}

class MyClass { }

これによりスタック上の構造体を Span<T> に見せかけることで参照型を含む配列的なものをアロケーションなしで作ることができる。ただし、stackalloc と異なりコンパイラーがコードをチェックできず return できてしまう危険性がある点に注意。

[Proposal]: ReadOnlySpan initialization from static data · Issue #5295 · dotnet/csharplang

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

private static ReadOnlySpan<byte> Bytes => new byte[] { ... }; のような最適化テクニックがあるが、一部のプリミティブでのみ使用できるものでそれ以外のケースでは罠となってしまうのでそれ用の構文が欲しいという提案。

Update docs for PipeReader.TryRead by waf · Pull Request #52237 · dotnet/runtime

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

Stream を元にした PipeReader.TryReadStream に対して読み込みを実行しないということをドキュメントに明記するという PR。