サポートされているコード変更 (C# および Visual Basic)

ホット リロード メカニズム (旧称 エディット コンティニュ) によって、メソッド本体内のほとんどの種類のコード変更が処理されます。 しかし、メソッドの本体外で行った変更の大部分やメソッドの本体内で行った一部の変更は、デバッグ時に適用できません。 このようなサポートされていない変更を適用するには、デバッグを停止し、新しいバージョンのコードを再起動する必要があります。

エディットとコンティニュのメカニズムでは、メソッドの本体内で行ったほとんどの種類のコード変更を処理できます。 しかし、メソッドの本体外で行った変更の大部分やメソッドの本体内で行った一部の変更は、デバッグ時に適用できません。 このようなサポートされていない変更を適用するには、デバッグを停止し、新しいバージョンのコードを再起動する必要があります。

コードに対するサポートされている変更

次の表に、デバッグ セッション中にセッションの再起動なしで C# コードと Visual Basic コードに対して実行できる変更を示します。

言語の要素または機能 サポートされている編集操作 制限事項
種類 メソッド、フィールド、コンス トラクターなどを追加します。 はい
Iterators 追加または変更します。 いいえ
非同期/待機式 追加または変更します。 はい
動的オブジェクト 追加または変更します。 いいえ
ラムダ式 追加または変更します。 はい
LINQ 式 追加または変更します。 ラムダ式と同じ
ジェネリック 追加または変更します。 はい
言語の要素または機能 サポートされている編集操作 制限事項
種類 メソッド、フィールド、コンス トラクターなどを追加します。 はい
Iterators 追加または変更します。 いいえ
非同期/待機式 追加または変更します。 はい
動的オブジェクト 追加または変更します。 いいえ
ラムダ式 追加または変更します。 はい
LINQ 式 追加または変更します。 ラムダ式と同じ

Note

エディット コンティニュでは、通常、文字列補間や null 条件演算子などの新しい言語機能がサポートされます。 最新の情報については、EnC でサポートされている編集に関するページを参照してください。

.NET 6 以降の機能強化

.NET 6 以降と Visual Studio 2022 以降のバージョンでの機能強化には、古いバージョンの Visual Studio でもともと可能であった機能以外の、さらに多くの種類の編集のサポートが含まれています。 これらの機能強化は、ホット リロードとエディット コンティニュの両方のエクスペリエンスで利用できます。

.NET 6 以降のホット リロード エクスペリエンスは、エディット コンティニュ メカニズムと Roslyn を利用しています。 サポートされている編集に関するページでは、Roslyn で現在サポートされている編集の種類と、今後の拡張の可能性が示されています。

コードに対するサポートされていない変更

次の変更は、デバッグ セッション中の C# と Visual Basic のコードには適用できません。

  • 現在のステートメントまたはその他のアクティブ ステートメントに対する変更。

    アクティブ ステートメントは、現在のステートメントを取得するために呼び出された、呼び出し履歴上の関数内に存在するすべてのステートメントです。

    ソース ウィンドウ内では、現在のステートメントは黄色の背景で表示されます。 その他のアクティブ ステートメント (読み取り専用) は、網かけの背景で表示されます。 これらの既定の色は、[オプション] ダイアログ ボックスで変更できます。

  • 次の表に、コードに対するサポートされていない変更を言語要素別に示します。

    言語の要素または機能 サポートされていない編集操作
    すべてのコード要素 名前の変更
    名前空間 [追加]
    名前空間、型、メンバー 削除
    インターフェイス 変更
    抽象または仮想メンバーを追加し、オーバーライドを追加する (詳細を参照)
    デストラクターを追加します。
    メンバー - 埋め込まれた相互運用機能型を参照するメンバーを変更する
    - 実行中のコードによって既にアクセスされた後で静的メンバーを変更する
    メンバー (Visual Basic) - On Error または Resume ステートメントを使用してメンバーを変更する
    - Aggregate、Group By、Simple Join、または Group Join LINQ クエリ句を含むメンバーを変更する
    メソッド - シグネチャを変更する
    - メソッド本体を追加することで、抽象メソッドを非抽象にする
    - メソッド本体を削除する
    属性 追加または変更します。
    イベントまたはプロパティ 型パラメーター、基本型、デリゲート型、または戻り値の型を変更する
    演算子またはインデクサー 型パラメーター、基本型、デリゲート型、または戻り値の型を変更する
    catch ブロック アクティブ ステートメントが含まれているときに変更する
    try-catch-finally ブロック アクティブ ステートメントが含まれているときに変更する
    ステートメントの使用 [追加]
    非同期メソッド/ラムダ .NET Framework 4 以下を対象とするプロジェクトで非同期メソッド/ラムダを変更する (詳細を参照)
    Iterators .NET Framework 4 以前を対象とするプロジェクトで反復子を変更する (詳細を参照)
    言語の要素または機能 サポートされていない編集操作
    すべてのコード要素 名前の変更
    名前空間 [追加]
    名前空間、型、メンバー 削除
    ジェネリック 追加または変更します。
    インターフェイス 変更
    抽象または仮想メンバーを追加し、オーバーライドを追加する (詳細を参照)
    デストラクターを追加します。
    メンバー - 埋め込まれた相互運用機能型を参照するメンバーを変更する
    - 実行中のコードによって既にアクセスされた後で静的メンバーを変更する
    メンバー (Visual Basic) - On Error または Resume ステートメントを使用してメンバーを変更する
    - Aggregate、Group By、Simple Join、または Group Join LINQ クエリ句を含むメンバーを変更する
    メソッド - シグネチャを変更する
    - メソッド本体を追加することで、抽象メソッドを非抽象にする
    - メソッド本体を削除する
    属性 追加または変更します。
    イベントまたはプロパティ 型パラメーター、基本型、デリゲート型、または戻り値の型を変更する
    演算子またはインデクサー 型パラメーター、基本型、デリゲート型、または戻り値の型を変更する
    catch ブロック アクティブ ステートメントが含まれているときに変更する
    try-catch-finally ブロック アクティブ ステートメントが含まれているときに変更する
    ステートメントの使用 [追加]
    非同期メソッド/ラムダ .NET Framework 4 以下を対象とするプロジェクトで非同期メソッド/ラムダを変更する (詳細を参照)
    Iterators .NET Framework 4 以前を対象とするプロジェクトで反復子を変更する (詳細を参照)

アンセーフ コード

アンセーフ コードを変更する場合、セーフ コードを変更するときと同じ制限に加えて、もう 1 つ追加の制限が適用されます。エディット コンティニュでは、stackalloc 演算子を含むメソッド内に存在するアンセーフ コードへの変更はサポートされていません。

アプリケーションのサポート

サポートされているアプリケーションは次のとおりです。

  • Windows 10 または Windows 11 の UWP アプリ
  • .NET Framework 4.6 デスクトップ以降のバージョン (.NET Framework はデスクトップ バージョンのみ) を対象とする x86 および x64 アプリ

.NET 6 以降の場合、次のファイルの種類の編集がサポートされています。

  • .cshtml
  • .razor

サポートされていないアプリ、プラットフォーム、操作

サポートされていないアプリケーションまたはプラットフォームは次のとおりです。

  • F#
  • .NET Native
  • Silverlight 5
  • Windows 8.1
  • Xamarin.Forms (iOS と Android)

ASP.NET と ASP.NET Core の場合、次のファイルの種類の編集はサポートされていません。

  • .aspx
  • .ascx
  • .aspx
  • .ascx
  • .cshtml
  • .razor

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

次のデバッグ シナリオでは、エディット コンティニュを使用できません。

  • 混合モードでの (ネイティブ/マネージ) デバッグ

  • .NET 7 以降を対象としない ARM64 でのデバッグ。

  • COR_ENABLE_PROFILING 環境変数 セットが設定されたデバッグ。

  • [デバッグ] メニューから [開始] を選んでアプリケーションを実行する代わりに、プロセスへのアタッチ ([デバッグ] > [プロセスにアタッチ]) を使用してアプリをデバッグします。 プロセスにアタッチするときに [編集して続行] を使用する場合は、 プロセス (set COMPLUS_ForceENC=1) を起動する前にCOMPLUS_ForceENC 環境変数を設定する必要があります。

  • 非決定論的 (時間ベースなど) のアセンブリ バージョンを使用したデバッグ。 [編集して続行] を使用する場合は、リリース (または CI) ビルドでのみバージョンを設定し、デバッグ ビルドのバージョンを一定に保つことを検討してください。

  • 最適化されたコードのデバッグ

  • SQL デバッグ

  • ダンプ ファイルのデバッグ。

  • 埋め込まれたランタイム アプリケーションのデバッグ

  • ビルド エラーによって新しいバージョンのビルドが失敗した後の旧バージョンのデバッグ