[日本語] Introducing the .NET Hot Reload experience for editing code at runtime


#はじめに
本記事は、2021 年 5 月 25 日（米国時間）ポストされた "**Introducing the .NET Hot Reload experience for editing code at runtime**" の抄訳（と、ちょっと手を加えたもの）となります。色々考えましたが、こじゃれたタイトルが全く思いつきませんでした。なので、タイトルはそのままです。ごめんなさい。
なお内容については下記原文が正となります。

https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/

Visual Studio 2019 バージョン 16.11 (Preview 1) および .NET 6 (Preview 4) の **dotnet watch** コマンドライン ツールを通じ、.NET ホット リロード機能を紹介いたします。
この記事では、.NET ホット リロードとは何か、またこの機能をどのように使い始めることができるかや、今後予定されている改善についての方向性、また、現在サポートされている編集機能や言語の種類についてなどについて触れていきます。
#.NET ホット リロードって何？
ホット リロードは、アプリケーション実行中に、一時停止やブレークポイントを手押しすることなく、アプリケーションの管理対象ソース コードを変更することができる機能です。アプリケーションの実行中にサポートされている変更を加えるだけで、新しい Visual Studio エクスペリエンスで「コード変更の適用」ボタンを使って編集内容を適用することができます。
![img1](https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2021/05/dotnet-Hot-Reload-VS-2019-version-16_11.gif)
ホット リロードは、WPF、Windows Forms、.NET MAUI (プレビュー)、ASP.NET Core アプリのコード ビハインド、コンソール アプリケーション、WinUI 3（要マネージド デバッガ）など、既存および今後予定されているプロジェクトの多くに対応しています。またサポート対象は非常に幅広く、.NET Framework または CoreCLR ランタイムを搭載したあらゆるプロジェクトに対応しています。

ホット リロードの目指すところは、どのようにアプリケーションを起動したいかに関わらず、この体験を提供することです。本リリースでは、完全に統合された Visual Studio デバッガや dotnet watch コマンドラインツールで機能を利用できるようになりましたが、今後さらに多くのオプションを提供していく予定です。
#はじめに
Visual Studio の最新のプレビューリリースまたは .NET 6 Preview 4 のいずれかを使用することができます。手順は以下のとおりです。
####Visual Studio でデバッグ時にホットリロードを試してみる

* Visual Studio 2019 バージョン 16.11 Preview 1 をダウンロードしてインストールする
* サポートされているプロジェクトタイプ（例えばWPFアプリ）を開く
* F5 を押すなど、デバッガーを接続した状態でアプリを起動する（デバッガーの設定/デバッグの起動プロファイルで「ネイティブコードのデバッグを有効にする」が無効になっていることを確認します）
* 実行中のアプリのユーザーインターフェースで再実行可能なコード（例：ボタンや ViewModel コマンドのコード ビハインド）や、タイマーで一定時間ごとにトリガーされるコードを含む C# コードファイルを開き、コードを変更する
* Visual Studio ツールバーの [続行] ボタンの隣にある [コード変更の適用]（ALT-F10）ボタンを使用して、コードの変更を適用する。(なお、Visual Studio を使用している場合は、ファイルの保存は必要ないので、コードを素早く変更して続行することが可能。)

作成した変更がサポートされているものであれば、新しいロジックで実行中のアプリにパッチが適用され、次回、自分のアクションやタイマーなどのコードのトリガーによって更新されたコードが再実行されたときに、アプリの動作に変化が見られるはずです。

ブレーク ポイント、編集して続行、XAML ホットリロードなど、他のデバッガ機能も引き続き使用できます。現在使用しているすべての機能は、.NET ホット リロードと並行してご利用いただけます。もし何かうまくいかないことがありましたら、以下のフィードバックなどからぜひご連絡ください。

https://docs.microsoft.com/visualstudio/ide/feedback-options?view=vs-2019

####CLI
dotnet watch を使ってアプリを起動する際に、コマンドラインからホット リロードをためしてみます。

* .NET 6 Preview 4 をインストールする
* 既存のASP.NET Coreプロジェクトを更新して、.NET 6をターゲットにする
* launchSettings.json 内のアプリの起動プロファイルに  “hotReloadProfile”: “aspnetcore” プロパティを追加する

以下、Properties/launchSettings.json の例です。

```diff_json
{
  "profiles": {
    "dotnet": {
      "commandName": "Project",
      "hotReloadProfile": "aspnetcore"
    }
  }
}
```

* dotnet watch を使ってプロジェクトを実行し、ホットリロードが有効になっていることを示す出力を確認する
* アプリケーションのマネージド ソースコードにサポートされているコードを変更し、ファイルを保存して適用する

Visual Studio から実施した場合と同様に、新しいロジックが適用され、次に更新されたコードを再実行したときに、アプリの動作に変化が見られるはずです。

この方法は、"blazorwasm" ホット リロード プロファイルを変更し、上記の同様の手順を踏むことで、Blazor WebAssembly プロジェクトでも使用できます。Windows フォームやその他の CoreCLR を使ったプロジェクトでも、上記の例の内容で Properties フォルダの下にlaunchSettings.json というファイルを手動で追加するだけで、この方法を試すことができます。

なお、2021 年 5 月 25 日現在、この機能はまだ開発中であり、現在のリリースではまだ限定的な利用となります。しかし、将来的には dotnet watch を使って launchSettings.json ファイルなしであらゆる種類の .NET Core アプリを簡単にホット リロードできるように改善していく予定です。
#Best in Visual Studio 2022 & .NET 6
今回のリリースでは、.NET 開発者向けのホット リロード機能は、まだプレビューとなります。初期の .NET 6 Preview や Visual Studio 2019 ではすでに一部の機能が利用できるようになっていますが、この機能をフルに活用するために、私たちは .NET 6（および今後リリースされる.NET）と今後リリースされる予定の Visual Studio 2022 を、最適な体験を享受いただくためのフレームワークとツールの組み合わせとしてターゲットしています。

今後のプレビュー版や最終リリースでどのような機能を提供する予定なのか、いくつかの例をご紹介します。

* **.NET Multi-platform App UI（.NET MAUI）**: 今後のリリースでは、iOS、Android、および Mac Catalyst シナリオにも .NET ホット リロード サポートを提供する予定です。
* **Razor Pages** : 将来のリリースでは、.NET 6 以上をターゲットとした Web サイトや Blazor アプリの Razor の編集で、ホット リロードと Edit and Continue (EnC) がサポートされます。
* **Visual Studio でデバッガーが不要に** : Visual Studio 2022 の将来のリリースでは、デバッガーを必要とせずにホット リロードを使用できるようサポートを追加する予定です。これにより、開発者は CTRL-F5 を使用してアプリケーションを起動しながら、実行中のアプリケーションにパッチを適用するためにホット リロードを使用することができます。
* **サポートされていない変更の数を減らす** : Visual Studio 2022および.NET 6+の将来のリリースでは、複数のチームが協力して、実行時にサポートされない編集を減らす作業を計画しています。
* **ホット リロードで最適に動作するようにフレームワークを最適化する** : .NET 6では、ホットリロードをより良くサポートするために、特定のフレームワークをどのように改善できるかを調査しています。将来的には、ASP.NET Core や .NET MAUI、その他のフレームワークの改良を行い、調整や最適化を行うことで、より多くの状況でホット リロードによる変更をより便利にすることができるようになります。

(※なお、上記は現時点での予定ですが、お客様のご意見やスケジュールに応じて計画が変更されることがあります。)
#サポートされている / されていない変更と言語
.NET ホット リロードの使用方法に関わらず、一部の変更はランタイムにサポートされていないため、rude edit ダイアログが表示され、適用するためにはアプリを再起動する必要があります。
サポート対象の編集の詳細については、機能、ドキュメントいずれもアップロードされていく予定です。
現時点では既存の [Edit and Continue (EnC) 対象のリスト](https://github.com/dotnet/roslyn/blob/main/docs/wiki/EnC-Supported-Edits.md) および [EnC ドキュメント](https://docs.microsoft.com/visualstudio/debugger/edit-and-continue?view=vs-2019)を確認ください。ホット リロードは EnC を使用しているため、この新機能をよりよく理解いただくための端緒になるのではないでしょうか。
詳細はこちらをご覧ください。

https://github.com/dotnet/roslyn/blob/main/docs/wiki/EnC-Supported-Edits.md

https://docs.microsoft.com/visualstudio/debugger/edit-and-continue?view=vs-2019

また、上記の例では特に C# を取り上げていますが、Visual Basic も Visual Studio のデバッガで実行する場合、様々な状況についてサポートされています。F# は現在 .NET 6 ではサポートされていませんが、お客様からのフィードバックに基づき、将来のリリースでサポートする予定です。
#ご意見・ご感想おまちしております！
この初期のプレビュー版では、問題があることをご了承ください。変更を適用しようとすると、自動的に失敗したり、アプリケーションがクラッシュしたりする場合があります。何か問題が発生した場合は、お手数ですが、以下から問題をご報告ください。皆様からのフィードバックがあって初めて、重要な問題が解決され、皆様のご意見に基づいて将来の決定が優先されることになりますので、是非ご意見ご感想をお寄せくださいませ！

https://docs.microsoft.com/visualstudio/ide/feedback-options?view=vs-2019

ご連絡は、上記 Visual Studio のフィードバックページからお願いします。

追記 : Visual Studio 2019 v16.10 および v16.11 プレビュー1 の他の機能などについてはこちらに記載しています。
https://qiita.com/uikou/items/9cb686122731df079008