支援的程式代碼變更 (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 偵錯。
調試轉儲檔案。
除錯嵌入式執行階段環境應用程式。
因為新版本因建置錯誤而無法建置,所以對舊版本的程式代碼進行偵錯。