在 Visual Studio(C#、Visual Basic、C++)中使用 熱重新載入 撰寫並除錯執行中的程式碼。

熱重新載入 先前在 Visual Studio 文件中稱為 Edit and Continue,部分舊版 UI 文字也包含此功能。

從 Visual Studio 2022 開始,Visual Studio 中的 熱重新載入 體驗同時適用於受管理的 .NET 應用程式和原生 C++ 應用程式。 不論你正在做哪種類型的應用程式,熱重新載入 的目的是盡可能省去你每次編輯之間重複應用程式的次數,減少等待應用程式重建、重啟和重新導航到應用程式中先前位置的時間,讓你更有效率。

我們透過讓您能編輯應用程式的程式碼檔案,並立即將程式碼變更套用到執行中的應用程式(也稱為 熱重新載入,來提升生產力。 套用變更之後,請再次執行程式碼,方法是在應用程式本身採取動作(或透過某種定時器等等),並立即查看變更;不需要透過斷點暫停應用程式!

用 熱重新載入 更新正在執行的程式碼

  1. 根據支援的應用程式類型開啟專案。 請參見 .NETC++ 支援的應用程式。

  2. 使用 F5 或者在支援的情況下,使用 Ctrl+F5,以附加調試器啟動應用程式。

  3. 開啟程式代碼檔案並變更程序代碼。

  4. 請使用 熱重新載入熱重新載入 圖示的截圖。 按鈕,或按下 ALT+F10

    熱重新載入 的截圖。

若要查看使用者介面中的變更,必須重新執行程序代碼。 例如,按鈕的反向程式碼必須重新執行,或透過計時器以間隔觸發的程式碼。 再舉一例,ASP.NET Core 支援自動瀏覽器刷新,因為有 MetadataUpdateHandler 功能。

支援 .NET 應用程式

  • 使用 Visual Studio 2022 並用除錯器啟動應用程式時,基本的 熱重新載入 體驗適用於大多數類型的 .NET 應用程式和框架版本。 此支援包括 .NET Framework、.NET Core 及 .NET 5+(適用於 C# 與 Visual Basic(視情況而定)。 在這種情況下,預期如果你正在使用除錯器,就假設 熱重新載入 是可用的,然後試試看!
  • 當使用 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 的應用程式,能帶來最強大的 熱重新載入 體驗。

下表顯示依專案類型,支援 .NET 熱重新載入 所需的最低 .NET 版本,分別列出連接除錯器(F5)和未連接除錯器(Ctrl+F5)時所需的版本。 必須使用 Visual Studio 2022 版本 17.8 或更新版本。

應用程式類型 F5 Ctrl+F5 MetadataUpdateHandler 支援
控制台 .NET 6 .NET 6
在 Linux/macOS 上執行
(Docker 和 WSL)
.NET 8 .NET 6 .NET 8
在Arm64上執行 .NET 7 .NET 7 .NET 7
WPF .NET 6 .NET 6
WinForms .NET 6 .NET 6
ASP.NET .NET 6 .NET 6
Blazor Server .NET 6 .NET 6 .NET 6
Blazor WebAssembly(Blazor 網頁組件) .NET 6 .NET 6 .NET 6
毛 伊 島
(WinUI/Android/iOS)
.NET 6 -- --

你能用 熱重新載入 做的 類型編輯是由執行時和編譯器版本決定,而不是你啟動應用程式的方法(F5 或 Ctrl+F5)。

在下列各節中,我們會提供其他詳細數據。

支援 .NET Framework 應用程式

使用 Visual Studio 2022 並用除錯器啟動應用程式時,基本的 熱重新載入 體驗適用於大多數類型的 .NET 應用程式和框架版本。 此支援包括 .NET Framework、.NET Core 及 .NET 5+(適用於 C# 與 Visual Basic(視情況而定)。 在這種情況下,預期如果你正在使用除錯器,就假設 熱重新載入 是可用的,然後試試看!

支援C++應用程式

在使用 Visual Studio 2022 並用除錯器啟動應用程式時,你可以在除錯器(F5)下,使用 熱重新載入 按鈕進行 hot reload 一個原生的 C++ 應用程式。 熱重新載入 也支援使用 CMake 和 OpenFolder 專案開發的應用程式。

為了讓你的專案支援 熱重新載入,你需要設定以下選項:

  • Project > 屬性 > C/C++ > 一般 >除錯資訊格式必須設為「程式資料庫用於編輯與繼續 /ZI
  • Project > 屬性 > 連結器 > 一般 >啟用增量連結必須設定為「Yes /INCREMENTAL

如需支持的編輯,請參閱 C++支援的程式代碼變更

使用 Visual Studio 2022 搭配 .NET 或 .NET 框架應用程式,使用除錯器時

使用 Visual Studio 2022 並用除錯器啟動應用程式時,熱重新載入 可支援大多數應用程式框架。

只要你有 .NET 並使用 Visual Studio 受控除錯器,應該都能獲得基本的 熱重新載入 支援。 這也意味著即使是像 Azure Functions 這樣的專案,在這種情況下也能運作得很好。

注意

預設情況下,有些專案使用混合模式除錯,這不支援 熱重新載入。 你可以在專案設定中修改此設定,方法是將 專案 > 屬性 > 偵錯 > 開啟偵錯啟動設定介面 > 啟用原生程式碼偵錯 設定為 false。

使用 Visual Studio 2022 搭配 .NET 應用程式,但沒有使用除錯器

熱重新載入 在針對大多數 .NET 6+ 應用程式時,無需除錯器即可使用。

此功能僅限於 .NET 6+。 那些不針對 .NET 6+(也就是針對 .NET 5 或以下)的應用程式,不支援「無除錯器」情境,必須使用除錯器才能取得 熱重新載入 功能。

此外,並非所有專案類型目前都支援「無除錯器」情境,詳見 支援.NET應用程式

Visual Studio 2022 搭配 .NET 6+ 應用程式

如果你同時使用 Visual Studio 2022,並且開發針對 .NET 6+ 的應用程式,你就能享受到最精緻且功能最強的 熱重新載入 體驗。

在此案例中支援:

  • Blazor 應用程式(伺服器和 WebAssembly)
  • 編輯 Blazor 及一般 ASP.NET Core 網站中的 Razor 檔案
  • CSS 即時重載
  • XAML 熱重新載入
  • 在沒有除錯器的情況下執行應用程式時的 熱重新載入 支援(如前面更詳細說明)

如果你鎖定 .NET 6+,將會持續在即將推出的 Visual Studio 2022 更新、.NET 功能帶和重大版本中獲得改進。

支援的 ASP.NET Core 情境

基本的 熱重新載入 體驗在許多 ASP.NET 場景中都被支援。 最廣泛可用的功能是能夠更改大多數網頁應用程式的程式碼背後及其他 .NET 類別檔案。 此功能在使用 Visual Studio 除錯器時可正常運作,且在先前 熱重新載入 可用的所有地方皆可使用。 如需更具體的指引,請參閱 .NET 熱重新載入 在 ASP.NET Core 中的支援

針對開發目標為 .NET 6+ 的 ASP.NET Core 開發者,有一些功能是較低版本的 .NET 無法提供的。 這些功能包括:

  • CSHTML: 編輯 Razor CSHTML 檔案支援許多類型的編輯。
  • 瀏覽器重新整理: 當您在偵錯時編輯 Razor 檔案,變更會自動在您的網頁瀏覽器中重新整理。 這項功能先前只能在不使用調試程序的情況下啟動應用程式時使用。
  • CSS 熱重新載入: 你可以在應用程式執行時更改 CSS 檔案,且在你輸入時會立即套用到執行中的應用程式。
  • No Debugger: 當您使用 Visual Studio 在不使用除錯器的情況下啟動網頁應用程式(CTRL-F5)時,將獲得 熱重新載入 支援。

支援的 .NET 變更

.NET 熱重新載入體驗由 debugger 與 C# 編譯器(Roslyn)驅動。 Roslyn 支援編輯支援的程式代碼變更 (C# 和 VB) 列出目前支援的編輯類型,以及潛在的未來增強功能。

支援的 .NET 框架變更

.NET 熱重新載入體驗由 debugger 與 C# 編譯器驅動。 支援的程式代碼變更 (C# 和 VB) 列出目前支援的編輯類型,以及未來可能的增強功能。

不支援的 .NET 與 .NET Framework 專案

熱重新載入 在某些專案配置中無法使用:

  • 如果你使用 Visual Studio 沒有除錯器,熱重新載入 只適用於針對 .NET 6+ 的 .NET 應用程式。
  • 如果你用 Visual Studio 除錯器來執行你的應用程式,但你在設定中關閉了 Enable 熱重新載入 and Edit and Continue when debugging,熱重新載入 就不支援。
  • 不支持發行或自定義組建組態。 您的項目必須使用 Debug 組建組態。
  • 如果你目標是 F# 或 .NET 原生專案,
  • 有些啟動或編譯優化在 .NET 熱重新載入 中不受支援。 例如,如果您的專案除錯設定檔配置如下,.NET 熱重新載入不被支援:
    • 您的項目已啟用 修整功能。 例如,如果您的偵錯配置檔的項目檔中 PublishTrimmed 設定為 True,則不予支援。
    • 已為您的專案啟用 ReadyToRun。 例如,如果您的偵錯配置檔的項目檔中 PublishReadyToRun 設定為 True,則不予支援。

如需詳細資訊,請參閱 不支援的案例

熱重新載入 功能不支援 F#

熱重新載入 或 Edit and Continue 在除錯 F# 程式碼時不支援。 在偵錯會話期間,可以編輯 F# 程式代碼,但應該避免。 偵錯會話期間不會套用程式代碼變更。 因此,偵錯時對 F# 程式代碼所做的任何編輯,都會產生不符合所偵錯程式碼的原始程式碼。

設定 熱重新載入

要啟用、停用或設定 熱重新載入,請參見 Configure Edit and Continue

警告訊息

如果你看到以下對話框,熱重新載入 無法套用目前的編輯,除非重啟。 您可以選擇重建應用程式並套用變更(重新啟動),或繼續編輯。 如果您重建,所有應用程式狀態都會遺失。 如果你繼續編輯,可能會有額外的修改或修正,讓 熱重新載入 再次運作。

套用變更對話框的截圖。

套用變更對話框的截圖。

如果你在對話框中選擇無法套用變更時總是重建選項,你在當前Visual Studio會話中不會再看到該對話框,Visual Studio會自動重建並重新載入,而不是顯示對話框。

故障排除

如果 熱重新載入 沒有如預期運作,請檢查以下幾點:

  • 確認你使用的是支援的應用程式和情境。 某些專案類型、混合模式除錯、優化程式碼,以及Attach to Process情境不支援熱重新載入。 欲了解更多資訊,請參閱 不支援情境
  • 請確保應用程式使用 Debug 設定,並且在 Tools>Options>Debugging>.NET/C++ 熱重新載入 中啟用 熱重新載入。
  • Logging Verbosity 設為 DetailedDiagnostic,以取得 熱重新載入 輸出中的更多資訊。
  • 打開 Output 視窗,在 Show output from,選擇 熱重新載入 以檢視診斷訊息。
  • 如果某行在除錯時顯示為唯讀,可能是呼叫堆疊中的一個活動語句,或者編輯可能需要重新啟動。

如需常見診斷的清單,請參見 熱重新載入 及編輯並繼續錯誤訊息。 如果問題持續且輸出無法顯示明確原因,請使用 Report a Problem 向Visual Studio團隊反饋。

如果你在 .NET Core 上使用 Response Compression,請參考 response compression 的資訊。