培训
模块
使用 Visual Studio Code 调试器,以交互方式调试 .NET 应用 - Training
了解如何使用 Visual Studio Code 高效调试 .NET 应用以快速修复 bug。 使用 Visual Studio Code 中的交互式调试器分析和修复 C# 应用程序。
热重载机制(以前称为“编辑并继续”)在方法主体中处理大多数类型的代码更改。 在调试期间,大多数方法主体外部的更改,以及一些方法主体内的更改,无法应用。 若要应用这些不受支持的更改,必须使用新版代码停止调试并重启。
“编辑并继续”机制处理方法主体中大多数类型的代码更改。 在调试期间,大多数方法主体外部的更改,以及一些方法主体内的更改,无法应用。 若要应用这些不受支持的更改,必须使用新版代码停止调试并重启。
下表显示了在调试会话期间可能对 C# 和 Visual Basic 代码所做的更改,而无需重启会话。
语言元素或功能 | 支持的编辑操作 | 局限性 |
---|---|---|
类型 | 添加方法、字段、构造函数等 | 是 |
迭代器 | 添加或修改 | 不 |
async/await 表达式 | 添加或修改 | 是 |
动态对象 | 添加或修改 | 不 |
Lambda 表达式 | 添加或修改 | 是 |
LINQ 表达式 | 添加或修改 | 与 lambda 表达式 相同 |
泛 型 | 添加或修改 | 是 |
语言元素或功能 | 支持的编辑操作 | 局限性 |
---|---|---|
类型 | 添加方法、字段、构造函数等 | 是 |
迭代器 | 添加或修改 | 不 |
async/await 表达式 | 添加或修改 | 是 |
动态对象 | 添加或修改 | 不 |
Lambda 表达式 | 添加或修改 | 是 |
LINQ 表达式 | 添加或修改 | 与 lambda 表达式 相同 |
备注
“编辑并继续”通常支持较新的语言功能,如字符串内插和 NULL 条件运算符。 有关最新信息,请参阅 Enc 支持的编辑页。 对于 .NET Framework,支持的功能是列出的功能的子集,并且依赖于编译器版本。
.NET 6+ 和 Visual Studio 2022 及更高版本中的改进包括对更多类型的编辑的支持,这些编辑类型超出了 Visual Studio 早期版本中最初可能的内容。 这些改进适用于“热重载”和“编辑并继续”体验。
.NET 6+ 热重载体验由编辑并继续机制和 Roslyn 提供支持。 支持的编辑 列出了 Roslyn 当前支持的编辑类型和潜在的未来增强功能。
在调试会话期间,无法将以下更改应用于 C# 和 Visual Basic 代码。
对当前语句或任何其他活动语句的更改。
活动语句是调用堆栈上调用以访问当前语句的函数中的任何语句。
当前语句显示在源窗口中的黄色背景上。 其他活动语句具有阴影背景,并且为只读。 可以在 选项 对话框中更改这些默认颜色。
下表中概述了对按语言元素对代码所做的任何不受支持的更改。
对于 .NET 6+ 和 Visual Studio 2022,请参阅 支持的编辑 当前支持和不支持的编辑类型。
语言元素或功能 | 不支持的编辑操作 |
---|---|
所有代码元素 | 重 命名 |
命名空间 | 添加 |
命名空间、类型、成员 | 删除 |
接口 | 修改 |
类型 | 添加抽象或虚拟成员、添加替代(了解详细信息) |
类型 | 添加析构函数 |
成员 | - 修改引用嵌入式互操作类型的成员 - 在通过执行代码访问后修改静态成员 |
成员 (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
运算符的方法中退出的不安全代码的更改。
支持的应用程序包括:
对于 .NET 6 及更高版本,以下文件类型支持编辑:
不支持的应用程序或平台包括:
对于 ASP.NET 和 ASP.NET Core,以下文件类型不支持编辑:
在以下调试方案中,“编辑并继续”不可用:
混合模式(本机/托管)调试。
不以 .NET 7 或更高版本为目标,在 Arm64 上进行调试。
使用 COR_ENABLE_PROFILING 环境变量集进行调试。
使用“附加到进程”(“调试”>“附加到进程”)调试应用程序,而不是通过选择“调试”菜单中的“启动”来运行应用程序。 如果要在附加到进程时使用“编辑并继续”,则必须在启动进程()之前设置 set COMPLUS_ForceENC=1
环境变量。
使用不确定的(例如基于时间的)程序集版本进行调试。 如果要使用“编辑并继续”功能,请考虑仅在“发布”(或 CI)版本中设置版本,并在“调试”版本中保持版本不变。
调试优化的代码。
SQL 调试。
调试转储文件。
调试嵌入式运行时应用程序。
如果由于生成错误无法生成新版本的代码,则对旧版本的代码进行调试。
培训
模块
使用 Visual Studio Code 调试器,以交互方式调试 .NET 应用 - Training
了解如何使用 Visual Studio Code 高效调试 .NET 应用以快速修复 bug。 使用 Visual Studio Code 中的交互式调试器分析和修复 C# 应用程序。
文档
使用热重载编写和调试代码 - Visual Studio (Windows)
深入了解热重载功能(也称为“编辑并继续”),并在运行应用时对代码进行更改。
编辑并继续 (Visual C#) - Visual Studio (Windows)
Visual C# 项目可使用“编辑并继续”。 了解支持哪些编辑,以及如何控制是否应用编辑和何时应用编辑。
同步命名空间和文件夹名称 - Visual Studio (Windows)
了解如何使用“快速操作和重构”菜单来同步名称空间和文件夹名称。
扩展 .NET 热重载 - Visual Studio (Windows)
了解如何使用 MetadataUpdateHandler 属性扩展 .NET 热重载来支持其他场景。