You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core热重载为何生成DisplayClass11?相关报错咨询

.NET Core热重载相关问题解答

1. .NET Core热重载的实现原理及是否修改程序集

  • 实现原理:热重载依赖Roslyn的增量编译能力,检测到代码变更后仅编译修改的代码片段,生成增量IL代码。CoreCLR运行时通过Edit and Continue(EnC)机制,将新IL注入正在运行的进程中,替换原有类型的方法实现,无需重启应用即可生效。
  • 是否修改程序集:默认不会修改磁盘上的原始程序集文件。热重载的变更仅在内存中生效,运行时加载的是修改后的IL片段,磁盘上的.dll/.exe文件保持不变。只有当热重载无法处理变更(比如修改类继承结构、新增字段)时,dotnet watch会触发应用重启,此时才会重新生成磁盘上的程序集。

2. Blazor项目dotnet watch启动时TypeLoadException问题解析

报错核心说明

报错中的<BooksService.<>c__DisplayClass11_0并非热重载添加的类型,而是C#编译器自动生成的闭包类——当方法内使用lambda表达式、匿名方法并捕获外部变量时,编译器会生成这类以DisplayClass开头的嵌套类,用于存储捕获的变量。

报错原因

热重载过程中,若修改了WatchChangesAsync方法或其内部的lambda逻辑,编译器会生成新的闭包类版本,但后台服务BookBackgroundService仍在运行,持续引用旧版本的闭包类型,导致运行时无法找到匹配的类型,抛出Invalid_Token相关的加载异常。

解决建议

  • 若后台任务允许中断,热重载后手动重启应用,让服务加载新的类型;
  • 调整后台服务逻辑,避免在长期运行的异步任务中使用会被热重载影响的闭包,比如将lambda逻辑提取为独立方法;
  • 临时配置HostOptions.BackgroundServiceExceptionBehavior为Ignore(在Program.cs中设置),避免单个后台服务异常导致主机停止,但这只是临时方案,无法解决类型不匹配的根本问题:
builder.Services.Configure<HostOptions>(options =>
{
    options.BackgroundServiceExceptionBehavior = BackgroundServiceExceptionBehavior.Ignore;
});

内容的提问来源于stack exchange,提问作者Penney Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:25:01