支持的代码更改(C# 和 Visual Basic)

热重载机制(前称“编辑并继续”)在方法主体中处理大多数类型的代码更改。 但是,方法体外的大多数更改以及方法体内的小部分更改在调试期间不能应用。 若要应用这些不受支持的更改,您必须停止调试,重新开始新版本的代码。

“编辑并继续”机制处理方法体内的大多数类型的代码更改。 但是,方法体外的大多数更改以及方法体内的小部分更改在调试期间不能应用。 若要应用这些不受支持的更改,您必须停止调试,重新开始新版本的代码。

支持的代码更改

下表显示了在调试会话期间无需重启会话即可对 C# 和 Visual Basic 代码所进行的更改。

语言元素或功能 支持的编辑操作 限制
类型 添加方法、字段、构造函数等
迭代器 添加或修改
async/await 表达式 添加或修改
动态对象 添加或修改
Lambda 表达式 添加或修改
LINQ 表达式 添加或修改 与 lambda 表达式相同
泛型 添加或修改
语言元素或功能 支持的编辑操作 限制
类型 添加方法、字段、构造函数等
迭代器 添加或修改
async/await 表达式 添加或修改
动态对象 添加或修改
Lambda 表达式 添加或修改
LINQ 表达式 添加或修改 与 lambda 表达式相同

注意

“编辑并继续”通常支持较新的语言功能,如字符串内插和 NULL 条件运算符。 有关最新信息,请参阅 Enc 支持的编辑页。

.NET 6+ 改进

.NET 6+ 和 Visual Studio 2022 及更高版本中的改进包括对更多类型的编辑的支持,这超出了旧版 Visual Studio 最初提供的编辑类型。 这些改进适用于热重载和“编辑并继续”体验。

.NET 6+ 热重载体验由编辑并继续机制和 Roslyn 提供支持。 支持的编辑列出了 Roslyn 当前支持的编辑类型以及未来可能的增强功能。

不支持的代码更改

在调试会话期间,不能对 C# 和 Visual Basic 代码应用下列更改。

  • 对当前语句或任何其他活动语句的更改。

    活动语句是为转至当前语句而调用过的任何语句(位于调用堆栈上面的函数中)。

    当前语句在源窗口中显示在黄色背景上。 其他活动语句显示在阴影背景上,是只读的。 可在“选项”对话框中更改这些默认颜色。

  • 下表列出了按语言元素对代码进行的任何不受支持的更改。

    语言元素或功能 不支持的编辑操作
    所有代码元素 重命名
    命名空间 添加
    命名空间、类型、成员 Delete
    接口 修改
    类型 添加抽象或虚拟成员、添加替代(了解详细信息
    类型 添加析构函数
    成员 - 修改引用嵌入式互操作类型的成员
    - 在通过执行代码访问后修改静态成员
    成员 (Visual Basic) - 使用 On Error 或 Resume 语句修改成员
    - 修改包含 Aggregate、Group By、Simple Join 或 Group Join LINQ 查询子句的成员
    方法 - 修改签名
    - 通过添加方法主体使抽象方法变为非抽象方法
    - 删除方法主体
    属性 添加或修改
    事件或属性 修改类型参数、基类型、委托类型或返回类型
    运算符或索引器 修改类型参数、基类型、委托类型或返回类型
    捕捉块 在包含活动语句时进行修改
    try-catch-finally 块 在包含活动语句时进行修改
    using 语句 添加
    异步方法/lambda 在面向 .NET Framework 4 及更低版本的项目中修改异步方法/lambda(了解详细信息
    迭代器 在面向 .NET Framework 4 及更低版本的项目中修改迭代器(了解详细信息
    语言元素或功能 不支持的编辑操作
    所有代码元素 重命名
    命名空间 添加
    命名空间、类型、成员 删除
    泛型 添加或修改
    接口 修改
    类型 添加抽象或虚拟成员、添加替代(了解详细信息
    类型 添加析构函数
    成员 - 修改引用嵌入式互操作类型的成员
    - 在通过执行代码访问后修改静态成员
    成员 (Visual Basic) - 使用 On Error 或 Resume 语句修改成员
    - 修改包含 Aggregate、Group By、Simple Join 或 Group Join LINQ 查询子句的成员
    方法 - 修改签名
    - 通过添加方法主体使抽象方法变为非抽象方法
    - 删除方法主体
    属性 添加或修改
    事件或属性 修改类型参数、基类型、委托类型或返回类型
    运算符或索引器 修改类型参数、基类型、委托类型或返回类型
    捕捉块 在包含活动语句时进行修改
    try-catch-finally 块 在包含活动语句时进行修改
    using 语句 添加
    异步方法/lambda 在面向 .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 环境变量集进行调试。

  • 使用“附加到进程”(“调试”>“附加到进程”)调试应用程序,而不是通过选择“调试”菜单中的“启动”来运行应用程序。 如果要在附加到进程时使用“编辑并继续”,则必须在启动进程 (set COMPLUS_ForceENC=1) 之前设置 COMPLUS_ForceENC 环境变量。

  • 使用非确定性(例如基于时间)程序集版本进行调试。 如果要使用“编辑并继续”,请考虑仅在发布(或 CI)构建中设置版本,并保持调试构建中的版本不变。

  • 调试优化后的代码。

  • SQL 调试。

  • 调试转储文件。

  • 调试嵌入式运行时应用程序。

  • 如果由于生成错误无法生成新版本的代码,则对旧版本的代码进行调试。