支持的代码更改(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 代码。

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

    活动语句是调用堆栈上调用以访问当前语句的函数中的任何语句。

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

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

    语言元素或功能 不支持的编辑操作
    所有代码元素 重 命名
    命名空间 添加
    命名空间、类型、成员 删除
    接口 修改
    类型 添加抽象或虚拟成员、添加替代(了解详细信息
    类型 添加析构函数
    成员 - 修改引用嵌入式互操作类型的成员
    - 在通过执行代码访问后修改静态成员
    成员 (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 调试。

  • 调试转储文件。

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

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