共用方式為


支援的程式代碼變更 (C# 和 Visual Basic)

熱重載機制,之前被稱為「Edit and Continue」,可以處理方法體內的大多數程式碼變更類型。 不過,在方法主體之外,大部分變更,以及方法主體內的一些變更,無法在偵錯期間套用。 若要套用那些不支援的變更,您必須停止偵錯,並使用新版的程式代碼重新啟動。

編輯及繼續機制支援方法內大部分的程式碼變更類型。 不過,大部分的方法主體之外的變更,以及一些方法主體內的變更,無法在偵錯期間套用。 若要套用那些不支援的變更,您必須停止偵錯,並使用新版的程式代碼重新啟動。

程式碼變更已被支持

下表顯示偵錯會話期間可能對 C# 和 Visual Basic 程式代碼所做的變更,而不需要重新啟動作業階段。

語言元素或特徵 受支持的編輯操作 局限性
類型 新增方法、欄位、建構函式等等
迭代器 新增或修改
async/await 表達式 新增或修改
動態物件 新增或修改
Lambda 表達式 新增或修改
LINQ 運算式 新增或修改 與 lambda 運算式相同
泛型 新增或修改
語言元素或功能 支援的編輯作業 局限性
類型 新增方法、欄位、建構函式等等
迭代器 新增或修改
async/await 表達式 新增或修改
動態物件 新增或修改
Lambda 表達式 新增或修改
LINQ 運算式 新增或修改 與 lambda 表達式一樣

注意

較新的語言功能,例如字串插值和空條件運算符,通常受到編輯及繼續功能的支援。 如需最新的資訊,請參閱 Enc 支援的編輯 頁面。

.NET 6+ 功能改善

.NET 6+ 和 Visual Studio 2022 和更新版本中的改善包括支援更多類型的編輯,超過舊版 Visual Studio 中原本可能的內容。 熱重載和編輯和繼續體驗都可使用這些改進功能。

.NET 6+ 熱重載體驗是由 Edit and Continue 機制和 Roslyn 所提供。 支援的編輯 列出 Roslyn 目前支援的編輯類型,以及潛在的未來增強功能。

不受支持的程式碼變更

在偵錯會話期間,無法將下列變更套用至 C# 和 Visual Basic 程式代碼。

  • 當前語句或任何其他活躍語句的變更。

    在呼叫堆疊上,任何在函式中的活動語句都是為了到達當前這句語句所呼叫的語句。

    目前的語句會出現在來源視窗中的黃色背景上。 其他活動語句會出現在陰影背景上,並且為唯讀狀態。 這些預設色彩可以在 [選項] 對話框中變更。

  • 下表所述,依語言元素對程式碼所做的任何不支援的變更。

    語言元素或功能 不支援的編輯作業
    所有程式碼元素 重新命名
    命名空間
    命名空間、類型、成員 刪除
    介面 修改
    類型 新增抽象或虛擬成員、新增覆寫(請參閱 詳細數據
    類型 新增解構函式
    成員 - 修改參考內嵌 Interop 類型的成員
    - 在執行程式代碼之後修改靜態成員
    成員 (Visual Basic) - 使用 On Error 或 Resume 語句來修改成員
    - 修改包含 Aggregate、Group By、Simple Join 或 Group Join LINQ 查詢子句的成員
    方法 - 修改簽章
    - 藉由新增方法主體,讓抽象方法變成非抽象方法
    - 刪除方法主體
    屬性 新增或修改
    事件或屬性 修改類型參數、基底類型、委派類型或傳回類型
    運算子或索引器 修改類型參數、基底類型、委派類型或傳回類型
    catch 區塊 當包含活動語句時進行修改
    try-catch-finally 區塊 當包含主動語句時進行修改
    using 語句
    非同步方法/lambda 表達式 修改以 .NET Framework 4 和更低版本為目標的專案中的異步方法/Lambda(請參閱 詳細數據
    反覆運算器 修改以 .NET Framework 4 和更早版本為目標的專案中的反覆運算器(請參閱 詳細數據
    語言元素或特徵 不支援的編輯作業
    所有程式碼元素 重新命名
    命名空間
    命名空間、類型、成員 刪除
    泛型 新增或修改
    介面 修改
    類型 新增抽象或虛擬成員、新增覆寫(請參閱 詳細數據
    類型 新增解構函式
    成員 - 修改參考內嵌 Interop 類型的成員
    - 已存取靜態成員後,再進行程式代碼執行來修改它
    成員 (Visual Basic) - 使用 On Error 或 Resume 語句修改成員
    - 修改包含 Aggregate、Group By、Simple Join 或 Group Join LINQ 查詢子句的成員
    方法 - 修改簽章
    - 藉由新增方法主體,讓抽象方法變成非抽象方法
    - 刪除方法主體
    屬性 新增或修改
    事件或屬性 修改類型參數、基底類型、委派類型或傳回類型
    運算子或索引器 修改類型參數、基底類型、委派類型或傳回類型
    catch 區塊 當中包含主動語句時進行修改
    try-catch-finally 區塊 當它包含使用中語句時修改
    using 陳述式
    非同步方法/匿名函數 修改以 .NET Framework 4 和更低版本為目標的專案中的異步方法/Lambda(請參閱 詳細數據
    迭代器 修改以 .NET Framework 4 和更早版本為目標的專案中的反覆運算器(請參閱 詳細數據

不安全的程序代碼

對不安全程式代碼的變更具有與安全程式碼變更相同的限制,但有一項額外的限制:編輯後繼續不支援在包含 stackalloc 運算子的方法內結束之不安全程式代碼的變更。

應用程式支援

支援應用程式包括:

  • Windows 10 或 Windows 11 中的 UWP 應用程式
  • 針對 .NET Framework 4.6 或更高版本的 x86 和 x64 應用程式(.NET Framework 只適用於桌面版本)

針對 .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

不支援的案例

以下偵錯情況下無法使用編輯並繼續:

  • 混合模式 (原生/受控) 偵錯。

  • 在 Arm64 上偵錯,而不需要以 .NET 7 或更新版本為目標。

  • 使用 COR_ENABLE_PROFILING 環境變數集進行偵錯。

  • 使用附加至程序(偵錯 > 附加至程序)來偵錯應用程式,而不是從 [偵錯 ] 功能表選擇 [開始 ] 來執行應用程式。 如果您想要在附加至進程時使用 [編輯後繼續],必須先設定 COMPLUS_ForceENC 環境變數,才能啟動進程 (set COMPLUS_ForceENC=1)。

  • 使用不具決定性(例如,以時間為基礎)的元件版本進行偵錯。 如果您想要使用 [編輯後繼續],請考慮只在發行(或 CI)組建中設定版本,並讓偵錯組建中的版本保持不變。

  • 偵錯已優化的程式碼。

  • SQL 偵錯。

  • 調試轉儲檔案。

  • 除錯嵌入式執行階段環境應用程式。

  • 因為新版本因建置錯誤而無法建置,所以對舊版本的程式代碼進行偵錯。