2021-10-29: Hot Reload, Visual Studio 2022 RC3 & Preview 7, GitHub Universe 2021

Published on Friday, 29 October 2021

dotnet コマンドから一度削除された Hot Reload が戻ってきました。

削除に対するプロセスがあまり健全ではなく、コミュニティーからの大きな反発を受けて revert される形となりました。また Rider もホットリロードのサポートをアナウンスしています。


Visual Studio 2022 の RC3 と Preview 7 がリリースされています。RC2 / Preview 6 同様、更新内容は不具合の修正です。


GitHub Universe 2021 が10月27日、28日に開かれました。

その中で新しい Issue のベータ公開やコマンドパレット機能、 Codespaces に関する CLI ツールの強化といった新機能がいくつか発表されています。


Raspberry Pi Zero 2 W が発表されました。

Raspberry Pi Zero では SoC に BCM2835 (ARM11 コア, ARMv6 アーキテクチャー) が搭載されていましたが、Zero 2 では Raspberry Pi 3 と同じ BCM2710A1 (Cortex-A53 コア, ARMv8 アーキテクチャー) となっています。

.NET Core や .NET 5 以降では ARM アーキテクチャーをサポートしていますが、サポートするアーキテクチャーの下限は ARMv7 となっており、ARMv6 の Raspberry Pi Zero では動作しませんでした。今回 ARMv8 アーキテクチャーとなることで .NET アプリケーションの動作が可能となることが期待できます。

スイッチサイエンスによるとまだ工事設計認証が取得できていないので日本での販売は少し先になるようです。

トピックス

.NET Hot Reload Support via CLI

https://devblogs.microsoft.com/dotnet/net-hot-reload-support-via-cli/

削除されたホットリロードを戻す Pull Request を取り込み、GA に含まれるアナウンス。

記事では Visual Studio を優先したため削除したといった経緯などについても触れている。

What’s new in the Rider 2021.3 EAP5

https://twitter.com/jetbrainsrider/status/1451555367117275163

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

.NET 6 のホットリロードサポートの追加、.NET 5/.NET Core 3.x の XAML プレビュー対応、NuGet のバインディングリダイレクト、Unity サポートの向上などが含まれる。

.NET のホットリロードサポートは .NET 6 をターゲットとしたときに利用可能となる。ASP.NET Core であれば Razor テンプレート、それ以外のアプリケーション形式(コンソールアプリケーション、Windows Forms、WPF、WinUI 等)であっても機能するが、現状 C# のホットリロードにフォーカスしているため XAML のホットリロードは限定的となっている。

その他、現状の制限事項として下記のものが挙げられている。

  • ASP.NET Core アプリケーションの自動ページリロード機能がない
  • デバッグ実行中のホットリロードは Windows に限定される
  • F# と VB ではホットリロードがサポートされない

その他、.NET 5 と .NET Core 3.x の XAML プレビューに対応 (.NET 6 の対応は含まれない)、.NET Framework アプリケーションのプロジェクトで NuGet のバインディングリダイレクトを自動生成処理の追加、フォーマットとクリーンアップで複数のファイルやディレクトリを対象にできるようになった、Unity 向けの対応として .asmdef の条件付きシンボルの対応や Apple Silicon の Mac でファイルを Unity から開けない不具合の修正など。

ReSharper 2021.3 EAP5 is here!

https://twitter.com/resharper/status/1451551846280138754

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

メンバー実装のガターマークの最適化が行われデフォルトで有効化、dotPeek においてレコード型とレコード構造体に対応、dotTrace、dotCover、dotMemory のコマンドラインツールが Apple Silicon のネイティブビルドで提供されるようになったなど。

Visual Studio 2022 version 17.0 RC3 and Preview 7

https://docs.microsoft.com/en-us/visualstudio/releases/2022/release-notes-preview#17.0.0-pre.7.0

Visual Studio 2022 version 17.0 RC3 と Preview 7 がリリースされた。

Windows Forms のデザイナーの修正や Xamarin.Forms のテンプレートの更新、ホットリロードをはじめとする不具合の修正を含む。

Everything new from Universe 2021 | The GitHub Blog

https://github.blog/2021-10-27-everything-new-from-universe-2021/

GitHub Universe 2021 が10月27日、28日に開かれ、GitHub に関するアナウンスがあった。

Windows Terminal Preview 1.12 Release

https://devblogs.microsoft.com/commandline/windows-terminal-preview-1-12-release/

Windows Terminal Preview 1.12 がリリースされた。

様々なアプリケーションから起動されるデフォルトターミナルの設定を Windows Terminal に変更できるようになった。Windows Insider Program Dev Channel または Windows 11 で利用可能。

対象となる実行ファイルなどによってプロファイルがあった形での起動が可能となった。例えばスタートから起動されるコマンドプロンプトと PowerShell で開かれるプロファイルがそれぞれ異なるといったケースに対応できる。

前回のウィンドウ状態(ペインとタブ)を復元する機能が追加、ウィンドウのターミナル部分の完全な透過の対応や細かい改善や修正など。

New product: Raspberry Pi Zero 2 W on sale now at $15 - Raspberry Pi

https://www.raspberrypi.com/news/new-raspberry-pi-zero-2-w-2/

Raspberry Pi Zero 2 W が発表された。

Raspberry Pi Zero と同じフォームファクターで SoC が Raspberry Pi 3 と同じ BCM2710A1 (Cortex-A53 コア, ARMv8 アーキテクチャー) にアップグレード。スイッチサイエンスでの発売は工事設計認証を取得次第とのこと。

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

WebAssembry上で動くSilverlight、OpenSilverで何が出来るのか - Qiita

https://qiita.com/karuakun/items/b1c6a1b08a62b9e8d588

WebAssembly で動作する Silverlight 互換実装の OpenSilver のインストールや簡単な使用感についての記事。

Proxy any class by interface in C# with DispatchProxy

https://dev.to/nullabletype/proxy-any-class-by-interface-in-c-with-dispatchproxy-2i6a

System.Reflection.DispatchProxy の簡単な使い方の解説記事。

DispatchProxy クラスを継承することでインターフェースのメソッド実行に対するプロキシーを簡単に実装することができる。記事ではその際のパフォーマンスへの影響などについても触れている。

Exploring C# 10: Global Using Declarations

https://dev.to/daveabrock/exploring-c-10-global-using-declarations-lab

C# 10 で導入される Global Usings についての記事。

通常の C# ソースコードに記述する global using のほか static やエイリアスの指定、.csproj の <ItemGroup> を使用した定義についてなど。

Analyzers for ASP.NET Core in .NET 6: Exploring .NET Core 6 - Part 7

https://andrewlock.net/exploring-dotnet-6-part-7-analyzers-for-minimal-apis/

C#: 匿名型とValueTupleではシリアライズ結果が違う

https://zenn.dev/shimat/articles/c5248dda90270e

匿名型と名前付き ValueTuple を各種シリアライザー (MessagePack, JSON.NET, System.Text.Json) に通した際の結果の違いについての記事。

名前付き ValueTuple の名前は属性で付加されるだけの要素のため、大抵の場合出力にはキーとして含まれない。

NUnit vs. XUnit vs. MSTest: Comparing Unit Testing Frameworks In C#

https://www.lambdatest.com/blog/nunit-vs-xunit-vs-mstest/

NUnit と xUnit と MSTest の違いをまとめた記事。それぞれの属性が何に対応するかといったことなどもまとまっている。

C#で小さい複素数の積を大量に計算したかったのでSIMD実装とか試してみた - Qiita

https://qiita.com/amutou/items/9031667f21f77a95df1e

SDR (ソフトウェア無線) のデータ処理のために SIMD を使用してみたという記事。

File-Scoped Namespaces – A Look at New Language Features in C# 10 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/10/28/file-scoped-namespaces-in-csharp-10/

C# 10 で導入されるファイルスコープ名前空間について、ReSharper と Rider の対応も含めて解説している記事。

ReSharper と Rider では Code Styles として設定しチームで共有可能で、変換も Quick Fix から可能となる。テンプレートに関してもコードスタイルに合わせて自動的に変換するといったことも。

Encrypt/decrypt data with .NET 6 and Azure Key Vault

https://dev.to/425show/encryptdecrypt-data-with-net-6-and-azure-key-vault-oak

Azure Key Vault を使用してデータを暗号化、復号処理を行う方法についての記事。

Improving your ASP.NET Core site's file handling capabilities – part 1 – Introduction - imar.spaanjaars.com

https://imar.spaanjaars.com/626/improving-your-aspnet-core-sites-file-handling-capabilities-part-1-introduction

ASP.NET Core で Web アプリケーションのファイルデータを扱う手段として File クラスなどを直接使用するのではなくファイルアクセスを抽象化した IFileProvider インターフェースを使用する方法についての記事。

Azure Storage Blob を使用した IFileProvider の実装についても触れている。

Bite-Size .NET 6 - PriorityQueue<T, N>

https://exceptionnotfound.net/bite-size-dotnet-6-priorityqueue/

.NET 6 で導入される PriorityQueue<TElement, TPriority> クラスについての解説記事。

Testing gRPC with gRPCui Docker and Swagger

https://medium.com/@niteshsinghal85/testing-grpc-with-grpcui-docker-and-swagger-9cfc9531512

ASP.NET Core gRPC アプリケーションのデバッグやテストを行うために gRPC UI を Docker で使用する方法についての記事。

5x Lessons Learned from Migrating a Large Legacy to .NET 5/6 - NDepend

https://blog.ndepend.com/5x-lessons-learned-from-migrating-a-large-legacy-to-net-5-6

大きい .NET Framework プロジェクト (NDepend) を .NET 5/6 に移行する際の5つの学びについての記事。

NDepend の UI に依存しないコードを .NET Framework から .NET 5 へと移行したことで解析やレポーティング、といったツールが macOS や Linux で動作できるようになった。その中で得られた教訓を紹介している。

.NET Framework との共存には .NET Standard を選択すること、API の非互換といったペインポイント、ツールを使用して移行の助けをすること、コードの保守性を担保すること、3rd パーティーのライブラリはモジュール化され軽量でオープンソースであるべきといったことをあげている。

GitHub ActionsでXamarin AndroidをReleaseビルド (ストア提出用) - Qiita

https://qiita.com/kurema/items/becaf36dda27351e88cc

GitHub Actions で Xamarin Android のアプリケーションを Release ビルドし、ストア提出可能なパッケージを作る方法についての記事。

最適化の最前線から:Unity 2020 LTS でのマネージコードストリッピングの強化 | Unity Blog

https://blog.unity.com/ja/technology/tales-from-the-optimization-trenches-better-managed-code-stripping-with-unity-2020-lts

Unity でのアプリケーションビルドで使用されるマネージドコードのストリッピングを行う Unity リンカーについての記事。

Unity リンカーによって何が行われるのか、Unity 2020 LTS 以降で導入されたストリッピングの挙動をカスタマイズする属性などについて説明している。

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

AArnott/Xunit.Combinatorial: Adds combinatorial and pairwise testing capability to Xunit tests

https://github.com/AArnott/Xunit.Combinatorial

xUnit のテストのパラメータ値に組み合わせを渡せるようにする拡張ライブラリ。

例えば下記のような bool を引数にとるテストであれば自動で true / false の組み合わせを渡してテストできる。

[Theory, CombinatorialData]
public void CheckFileSystem(bool recursive) { /* ... */ }

他にも複数指定した組み合わせをテストできる。

[Theory, CombinatorialData]
public void CheckValidAge(
    [CombinatorialValues(5, 18, 21, 25)] int age,
    bool friendlyOfficer)
{
    // This will run with all combinations:
    // 5  true
    // 18 true
    // 21 true
    // 25 true
    // 5  false
    // 18 false
    // 21 false
    // 25 false
}

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

プリミティブ: .NET 用拡張機能ライブラリ

https://docs.microsoft.com/ja-jp/dotnet/core/extensions/primitives

Microsoft.Extensions.Primitives についての説明ドキュメント。

CancellationToken を使用して変更通知を受け取れる CancellationChangeTokenStringSegment, StringTokenizer, StringValues といった文字列を扱うクラスなどについて触れている。

Your code displays Japanese wrong

https://heistak.github.io/your-code-displays-japanese-wrong/

アプリケーションで日本語を表示したとき、期待されるグリフとは別なものが表示されるいわゆる中華フォント状態となってしまう場合にどうしてそうなるのか、どうすれば解決するのかを非 CJK の開発者に伝えるためのドキュメント。

ツイート

finally 句の中が Conditional ですべてなくなったとしてもコンパイル結果には finally 自体は残っているという話。

.NET 6 から ISpanFormattable が使えるようになったので TryFormatSpan<Char> に書き込めるものが増えたという話。

Unity の Burst コンパイラーの 1.6.1 から Span<T> / ReadOnlySpan<T> が関数ポインターや Job の中のみという制限があるもののサポートされた話。

Unity で csc.rsp に -appconfig:app.config の形で設定を記述することで bindingRedirect できるというテクニック。

Deep Dive

API Implementation: Add Indexer to Vectors by deeprobin · Pull Request #60517 · dotnet/runtime

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

Vector 系の構造体にインデックスアクセスを可能にする PR。.NET 7 に含まれる予定。

[SUPER DRAFT] New API for invoking JS functions from C# by kg · Pull Request #60765 · dotnet/runtime

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

WebAssembly 向けに icall を実装することで C# から JavaScript の関数を呼び出したりするオーバーヘッドを小さくするという PR。

Add ObjectDisposedException.Throw for object instance and type by Bibletoon · Pull Request #58684 · dotnet/runtime

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

ObjectDisposedException を簡単にスローするためのヘルパーメソッド ThrowIf の追加 PR。.NET 7 に含まれる予定。

Resolve differences between string.IndexOfAny and MemoryExtensions.IndexOfAny · Issue #60864 · dotnet/runtime

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

string.IndexOfAnyanyOf 引数の値が5つ以下の時は MemoryExtensions.IndexOfAny をそのまま呼び出し、6つ以上の時は Probabilistic Map を使用しているが、挙動をそろえてそのまま MemoryExtensionsに 移譲するのでいいのではないかという Issue。

Improve vectorization of MemoryExtensions.IndexOf(..., span) · Issue #60866 · dotnet/runtime

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

MemoryExtensions.IndexOf はベクトル化できる余地があるのではないかという Issue。

Utf8 string literal proposal by jaredpar · Pull Request #5349 · dotnet/csharplang

https://github.com/dotnet/csharplang/pull/5349

UTF-8 文字列リテラルの初期プロポーザルのPR。