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

升级.NET6后Hangfire运行报错:无法从mscorlib.dll加载ISet类型

故障根因

这个问题是Hangfire 1.7.27版本本身的兼容缺陷导致的,具体有两点:

  1. 1.7.27及更早的1.7.x分支版本,类型解析逻辑还保留了.NET Framework时代的默认绑定规则,反序列化持久化的作业数据时,会优先从mscorlib程序集加载基础泛型类型。而.NET Core 3.0之后包括.NET 6,ISet<T>等大量基础集合类型已经从mscorlib迁移到了System.Runtime.dll,旧版本Hangfire没有适配这套类型转发规则,就会抛出类型加载失败的异常。
  2. 如果你在项目中混用了面向.NET Framework编译的Hangfire.Core等组件,也会触发这个问题:面向net4x编译的Hangfire组件默认只会从mscorlib加载BCL类型,无法识别.NET 6的程序集结构。
修复方案
  • 最稳妥的方案是直接将Hangfire.AspNetCore升级到1.7.30及以上的稳定版,Hangfire官方在1.7.29版本之后专门修复了.NET 5+运行时的类型解析兼容问题,已经适配了.NET新 runtime 的类型分布规则。
  • 若暂时无法升级版本,可以在服务注册阶段手动覆盖Hangfire的默认类型解析器,对旧的mscorlib类型引用做重定向:
using Hangfire.Common;

// 在Program.cs添加Hangfire服务之前注入以下逻辑
TypeHelper.DefaultTypeResolver = typeName =>
{
    // 匹配到指向mscorlib的ISet类型引用时,替换为System.Runtime的对应引用
    if (typeName.Contains("System.Collections.Generic.ISet") && typeName.Contains("mscorlib, Version=4.0.0.0"))
    {
        typeName = typeName.Replace("mscorlib, Version=4.0.0.0", "System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
    }
    return Type.GetType(typeName, throwOnError: false);
};
  • 检查所有Hangfire相关依赖的目标框架,确保引用的是netstandard2.0或更高版本的编译产物,不要引入面向.NET Framework 4.x编译的Hangfire包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:36:00