Visual Studio でホット リロードを使って実行中のコードの記述とデバッグを行う (C#、Visual Basic、C++)

適用対象:yesVisual Studio noVisual Studio for Mac noVisual Studio Code

Visual Studio 2022 から、Visual Studio のホット リロード エクスペリエンスがマネージド .NET とネイティブ C++ アプリの両方で機能するようになります。 作業しているアプリの種類にかかわらず、ホット リロードの目的は、編集の間のアプリの再起動をできるだけ減らし、アプリのリビルド、再起動、アプリ内の前にいた場所への再移動などにかかる時間を短縮して、生産性を向上させることです。

アプリケーションのコード ファイルを編集し、そのコード変更を実行中のアプリケーションに対して直ちに適用できるようにすることで、これを実現します ("ホット リロード" とも呼ばれます)。 変更が適用されたら、アプリ自体のアクションを実行して (または何らかのタイマーなどを使って) コードを再実行し、すぐに変更内容を確認できます。ブレークポイントによるアプリの一時停止は必要ありません。

ホット リロードを使って実行中のコードを更新する

  1. サポートされているアプリケーションの種類に基づいてプロジェクトを開きます。 詳細については、.NET アプリケーションのサポートに関するセクションを参照してください。

  2. デバッガーの設定またはデバッグ起動プロファイルで、 [ネイティブ コードのデバッグを有効にする] が無効になっていることを確認します。

  3. F5 キーを使うか、お使いのアプリケーションでサポートされている場合は Ctrl + F5 キーを使って、デバッガーをアタッチしてアプリを起動します。

  4. 実行中のアプリのユーザー インターフェイスを使って再実行することができるコード (たとえば、ボタンのコードビハインドや viewmodel のコマンドなど) や、タイマーによって一定の間隔でトリガーされる機能を含む C#、C++、または Visual Basic のコード ファイルを開き、コードを変更します。

  5. [ホット リロード] ボタンを使うか Alt + F10 キーを押して、コードの変更を適用します。

    [ホット リロード] ボタンのスクリーンショット。

サポートされている .NET アプリ フレームワークとシナリオ

  • Visual Studio 2022 を使ってデバッガーと共にアプリを起動する場合、ホット リロードの基本的なエクスペリエンスは、ほとんどの種類の .NET アプリとフレームワーク バージョンで機能します。 このサポートには、.NET Framework、.NET Core、.NET 5 以降 (該当する場合は C# と Visual Basic の両方に対して) が含まれます。 サポートされているアプリの種類には、Web (コードビハインドの変更)、デスクトップ、モバイル、クラウドをはじめとするプロジェクトの種類が含まれます。 このシナリオでは、デバッガーを使う場合、ホット リロードを利用できると想定して構いません。ぜひお試しください。
  • Visual Studio 2022 を使うがデバッガーを使わない場合 (たとえば、Ctrl - F5 キーを使ってアプリを起動する場合)、.NET 6 アプリのほとんどの種類をターゲットとしている場合はホット リロードを利用できます。 つまり、.NET 6 をターゲットとしない (.NET 5 以下をターゲットとする) アプリでは "デバッガーなし" のシナリオはサポートされません。ホット リロードのサポートを得るにはデバッガーを使う必要があります。
  • Visual Studio 2022 と .NET 6 アプリを使う場合、最も多くのシナリオがサポートされます。 上記で説明した新しい "デバッガーなし" の機能だけではありません。 他の新機能も含まれています。たとえば、Blazor プロジェクトのホット リロードや、より一般的には、任意の ASP.NET Core アプリでの Razor ファイルの編集、CSS ホット リロードのサポートなどです。 Visual Studio 2022 と .NET 6 をターゲットとするアプリの両方を同時に使うと、最も強力なホット リロード エクスペリエンスが得られます。

次の表に、デバッガーをアタッチする場合 (F5) とデバッガーをアタッチしない場合 (Ctrl + F5) で .NET ホット リロードがサポートされているアプリケーションの種類と、最小サポート (つまり、F5) に .NET 6 が必要かどうかを示します。 Ctrl + F5 キーのサポートには、常に .NET 6 が必要です。 また、この機能をサポートする Visual Studio の最小バージョンも示しています。

アプリケーションの種類 .NET 6 が必要 F5 Ctrl + F5
ASP.NET コードビハインド No 16.11 17.0
ASP.NET Razor (Blazor Server と ASP.NET Core) はい 17.0 17.0
ASP.NET Razor (Blazor WASM) はい 17.1 17.0
WPF No 16.11 17.0
WinUI3 No 16.11 --
WinForms No 16.11 17.0
コンソール No 16.11 17.0
.NET MAUI (WinUI 3) はい 17.1 --
.NET MAUI (Android) はい 17.1 --
.NET MAUI (iOS) はい 17.1 --
.NET MAUI Blazor Hybrid (WinUI 3) はい 17.1 --
.NET MAUI Blazor Hybrid (Android) はい 17.1 --
.NET MAUI Blazor Hybrid (iOS) はい 17.1 --

ホット リロードで行うことができる編集の種類は、アプリケーションを起動するために使った方法 (F5 キーまたは Ctrl + F5 キー) ではなく、ランタイムによって決まります。

次のセクションでは、上記の概要についてさらに詳しく説明し、詳細を調べます。

C++ アプリのサポート

Visual Studio 2022 を使っていてデバッガーと共にアプリを起動する場合、 [ホット リロード] ボタンを使ってデバッガーで実行しているとき (F5) にネイティブ C++ アプリケーションのホット リロードを実行できます。 ホット リロードは、CMake と OpenFolder プロジェクトを使ってビルドしたアプリでもサポートされます。

このエクスペリエンスは、ネイティブのエディット コンティニュを利用しています。 サポートされている編集については、エディット コンティニュに関する記事を参照してください。

Visual Studio 2022 と .NET アプリ (デバッガーを使う場合)

Visual Studio 2022 を使っていてデバッガーと共にアプリを起動する場合、ホット リロードはほとんどのアプリ フレームワークで動作します。たとえば、コンソール、Windows フォーム (WinForms)、WPF、UWP、WinUI 3 (注を参照) などの一般的なアプリの種類や、ASP.NET MVC、Web API、さらに以前の Web Forms プロジェクトなど、ほとんどの種類の ASP.NET Web プロジェクト (コードビハインドの編集用) などが含まれます。 これらは例の一部です。 .NET があって Visual Studio マネージド デバッガーを使っていれば、ホット リロードの基本的なサポートを利用できるはずです。 これは、Azure Functions などのプロジェクトもこのシナリオでうまく機能することを意味します。

注意

既定では、WinUI 3 では混合モードのデバッグが使われ、その場合ホット リロードはサポートされていません。 これは、プロジェクト設定でマネージド デバッガーを有効にすることで変更できます。これにより、ホット リロードが正常に機能するようになります。 プロジェクトでこれを有効にするには、launchSettings.json を変更して、commandName プロパティの後に "nativeDebugging": false を追加します。

.NET MAUI アプリは、Visual Studio 2022 バージョン 17.1 Preview 1 以降でサポートされています。

Visual Studio 2022 と .NET アプリ (デバッガーを使わない場合)

ほとんどの種類の .NET 6 アプリをターゲットとする場合は、デバッガーなしでホット リロードを利用できます。たとえば、コンソール、WPF、Windows フォーム (WinForms)、ASP.NET Core MVC、Web API、Blazor などのプロジェクトの種類です。

この機能は .NET 6 以降に限定されています。 .NET 6 をターゲットとしない (.NET 5 以下をターゲットとする) アプリでは "デバッガーなし" のシナリオはサポートされません。ホット リロード機能を利用するにはデバッガーを使う必要があります。

また、現時点では、すべてのプロジェクトの種類で "デバッガーなし" のシナリオがサポートされているわけではないことに注意してください。 具体的な内容は次のとおりです。

  • UWP アプリはデバッガーなしのホット リロードでサポートされていません。 これは仕様によるものであり、現時点では改善する予定はありません。
  • iOS と Android をターゲットとする Xamarin.Forms アプリでは、(デバッガーを使ってアプリを起動するかどうかに関係なく) .NET ホット リロードはサポートされていません。ただし、XAML ホット リロードは引き続きサポートされます。
  • .NET MAUI アプリは、デバッガーを使う場合にのみサポートされます。

Visual Studio 2022 と .NET 6 アプリ

Visual Studio 2022 を使っていて .NET 6 をターゲットとするアプリに取り組む場合は、最も洗練され、機能の豊富なホット リロード エクスペリエンスの利点が得られます。

このシナリオでは以下がサポートされます。

  • Blazor アプリ (サーバーおよび WebAssembly (注を参照))
  • Blazor と通常の ASP.NET Core Web サイトの両方での Razor ファイルの編集
  • CSS ホット リロード
  • デバッガーなしでアプリを実行する場合のホット リロードのサポート (詳細については前の説明を参照)

.NET 6 をターゲットとしている場合は、今後の Visual Studio 2022 の更新プログラムと .NET の機能バンドおよびメジャー リリースにおける機能強化を継続して取得できます。

注意

Visual Studio 2022 (バージョン 17.0) の最初のリリースでは、Visual Studio デバッガーを使用する場合の Blazor WebAssembly に対するホット リロードのサポートは現在有効になっていませんが、17.1 から使用できます。 デバッガーなしで Visual Studio からアプリを起動するか、17.1 リリースに更新することでも、引き続きホット リロードを使用できます。

サポートされている ASP.NET Core のシナリオ

多くの ASP.NET シナリオで、基本的なホット リロード エクスペリエンスがサポートされています。 最も広く利用できる機能は、ほとんどの種類の Web アプリケーションでコードビハインドやその他の .NET クラス ファイルを変更する機能です。 この機能は Visual Studio デバッガーを使っているときに動作し、以前にエディット コンティニュを利用できたすべての場所で利用できます。 より具体的なガイダンスについては、「ASP.NET Core の .NET ホット リロード サポート」を参照してください。

.NET 6 をターゲットとする ASP.NET Core の開発者は、.NET の下位バージョンでは使えない追加機能を利用できます。 次のような機能があります。

  • CSHTML: Razor CSHTML ファイルを編集するときに、多くの種類の編集がサポートされます。
  • ブラウザーの更新: razor ファイルを編集すると、デバッグ時に Web ブラウザーで変更内容が自動的に更新されます。 以前は、この機能はデバッガーなしでアプリを起動するときにのみ利用できました。
  • CSS ホット リロード: アプリの実行中に CSS ファイルを変更できます。変更内容は、入力するとすぐに実行中のアプリに適用されます。
  • デバッガーなし: Visual Studio を使ってデバッガーなしで Web アプリを起動するとき (Ctrl - F5) に、ホット リロードのサポートが得られます。

サポートされている .NET の編集

.NET のホット リロード エクスペリエンスは、エディット コンティニュのメカニズムを利用しています。 機能強化には、以前のバージョンの Visual Studio で元々可能だった機能を超える追加の種類の編集のサポートが含まれています。 機能強化は次のとおりです。

  • カスタム属性の追加、更新、または削除
  • Record 構造体の追加または更新
  • #line ディレクティブの追加または更新
  • Switch 式の編集
  • ディレクティブ自体の変更を含む、#line ディレクティブを使用するファイルの編集
  • 最上位レベルのステートメントの編集
  • グローバル using ディレクティブ、ファイル スコープ名前空間、改善されたラムダ、パラメーターレス構造体コンストラクターなど、C# 10 の新機能を使ったコードの編集
  • ラムダ パラメーターの名前の変更
  • 既存のメソッドのパラメーター名の変更

上記の機能強化は、ホット リロードとエディット コンティニュの両方のエクスペリエンスで利用できます。

サポートされていない .NET のシナリオ

サポートされていないシナリオ:

  • iOS と Android のシナリオでの Xamarin.Forms アプリでは、.NET ホット リロードはサポートされません。 UWP アプリをターゲットとする場合は、ホット リロードの部分的なサポートが得られます。 これは仕様によるものであり、これ以上の改善は予定されていません。 (注: 最新の SDK を使う Xamarin.Forms のお客様については、XAML ホット リロードは引き続き利用でき、サポートされます。)
  • .NET MAUI アプリは、Visual Studio 2022 バージョン 17.1 Preview 1 より前ではサポートされていません。 17.1 Preview 1 以降では .NET MAUI がサポートされていますが、デバッガーをアタッチする場合に限ります。
  • F# を使ってビルドしたアプリ、または .NET ネイティブをターゲットとするアプリでは、ホット リロードがサポートされていません。

デバッガーなしで Visual Studio を使う場合。 NET ホット リロードは .NET 6 をターゲットとするアプリに対してのみ機能します。

また、次の一部のプロジェクト構成ではホット リロードを利用できません。

  • Visual Studio デバッガーを使ってアプリを実行しても、設定で Edit and Continue を無効にしている場合は、ホット リロードはサポートされません。
  • リリースまたはカスタムのビルド構成はサポートされていません。 プロジェクトでは、デバッグ ビルド構成を使う必要があります。
  • 起動とコンパイルの最適化の一部は、.NET ホット リロードでサポートされていません。 たとえば、プロジェクトのデバッグ プロファイルが次のように構成されている場合、.NET ホット リロードはサポートされません。
    • プロジェクトに対してトリミングが有効になっている。 たとえば、デバッグ プロファイルのプロジェクト ファイルで PublishTrimmed が True に設定されている場合はサポートされません。
    • プロジェクトに対して ReadyToRun が有効になっている。 たとえば、デバッグ プロファイルのプロジェクト ファイルで PublishReadyToRun が True に設定されている場合はサポートされません。
  • WinUI 3 アプリの場合、ネイティブ コードのデバッグは既定で有効になっています (設定が LaunchSettings.json に存在しない場合でも)。この方法で混合モードのデバッグを行う場合、.NET ホット リロードはサポートされません。 このため、.NET ホット リロードを正常に動作させるには、LaunchSettings.json に明示的な設定 nativeDebugging: false を追加する必要があります。

ホット リロードの構成

ホット リロードを構成するには、 [ホット リロード] ドロップダウン ボタンから [設定] を選びます。

ホット リロードの構成のスクリーンショット

または、 [ツール]>[オプション]>[デバッグ]>[.NET と C++ のホット リロード] を開きます。

次のようなホット リロードの設定があります。

  • [Enable Hot Reload and Edit and Continue when debugging](デバッグ時にホット リロードとエディット コンティニュを有効にする) 。 デバッガーをアタッチした状態で起動するとき (F5) にホット リロードを有効にします。

  • [Enable Hot Reload when starting without debugging](デバッグなしで起動するときにホット リロードを有効にする) 。 デバッガーをアタッチしない状態で起動するとき (Ctrl + F5) にホット リロードを有効にします。

  • [Apply Hot Reload on File Save](ファイルの保存時にホット リロードを適用する) 。 ファイルを保存するときにコードの変更を適用します。

.NET ホット リロードの設定のスクリーンショット

また、.NET 6 プロジェクトの launchSetting.json を変更し、hotReloadEnabledfalse に設定することで、.NET ホット リロードをプロジェクト レベルで使用できるかどうかも制御できます。

例:

{
  "profiles": {
    "Console": {
      "commandName": "Project",
      "hotReloadEnabled": false
    }
  }
}

警告メッセージ

次のダイアログ ボックスが表示された場合、ホット リロードでは再起動せずに現在の編集内容を適用することができません。 アプリをリビルドして変更を適用する (再起動) か、編集を続行するかを選べます。 リビルドすると、すべてのアプリケーション状態が失われます。 編集を続行する場合は、追加の変更や修正によってホット リロードが再び動作する可能性があります。

変更の適用ダイアログ ボックスのスクリーンショット

ダイアログ ボックスで常にリビルドのオプションを選ぶと、現在の Visual Studio セッションではダイアログ ボックスは再度表示されなくなり、Visual Studio によってダイアログ ボックスを表示する代わりに自動的にリビルドと再読み込みが行われます。

注意

最初のリリースの Visual Studio (バージョン 17.0) では、デバッガーでホット リロードを使用するときに、標準の [エディット コンティニュ] ダイアログが引き続き表示されます。 これはバグであり、17.1 Preview 2 リリース以降では解決されています。

トラブルシューティング

ASP.NET Core で応答圧縮を使用している場合は、dotnet watch応答圧縮に関する情報を参照してください。

関連項目

エディット コンティニュ (Visual C#)エディット コンティニュ (C++)