Polly.Caching.Memory.MemoryCacheProvider抛出TypeLoadException排查
问题背景
当前项目引用的NuGet包配置如下:
<PackageReference Include="Polly" Version="7.2.2" /> <PackageReference Include="Polly.Caching.Memory" Version="3.0.2" />
以上包在独立测试项目中运行正常,集成到引入了大量其他NuGet包的现有应用程序时,抛出System.TypeLoadException异常,具体报错:
程序集Polly.Caching.Memory, Version=3.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc中的类型Polly.Caching.Memory.MemoryCacheProvider所含的TryGet方法无实现。
已完成的排查动作:
- 所有关联项目的Polly、Polly.Caching.Memory版本均已对齐
- 输出bin目录下存在正确版本的对应程序集
- 反汇编查看对应程序集,确认
TryGet方法已实现 - 暂未定位问题根因
进一步排查方向
- 确认运行时实际加载的程序集版本
启动程序触发异常前,打开Visual Studio的模块窗口(调试状态下依次选择「调试」→「窗口」→「模块」),筛选所有Polly相关的已加载程序集,核对每个dll的加载路径、版本号。不要默认bin目录下的dll就是运行时加载的文件:如果本机GAC(全局程序集缓存)中部署过旧版本的强签名Polly相关程序集,运行时会优先加载GAC中的版本,直接忽略本地bin目录下的正确版本。 - 检查程序集绑定重定向配置
打开项目运行时对应的配置文件(app.config/web.config/*.runtimeconfig.json),检查Polly相关的绑定重定向规则:- 针对.NET Framework项目,确认
runtime节点下的assemblyBinding配置中,Polly、Polly.Caching.Memory的旧版本绑定规则已清理,重定向的目标版本和实际引用的7.2.2/3.0.2版本一致。Polly 7.x版本调整过缓存提供器的接口签名,如果绑定重定向错误导致3.0.2版本的MemoryCacheProvider和6.x版本的Polly核心库匹配,就会出现“方法无实现”的类型加载错误。 - 针对.NET Core/.NET 5+项目,检查是否存在手动配置的程序集加载逻辑,强制加载了不兼容版本的Polly核心库。
- 针对.NET Framework项目,确认
- 全链路排查Polly生态包的版本依赖
打开项目编译生成的obj/project.assets.json文件,搜索所有Polly前缀的依赖项,核对所有间接依赖的Polly相关包(比如Polly.Caching.Abstractions、Polly.Extensions、第三方封装的Polly缓存/熔断组件)的版本要求,确认没有包拉取了不兼容的Polly核心版本或缓存抽象包版本。只要有一个组件依赖旧版本的缓存抽象接口,就会导致类型签名不匹配。 - 排查同名类型冲突
全局搜索现有项目代码、所有引用的第三方库,确认不存在自定义的Polly.Caching.Memory.MemoryCacheProvider类型、或者同名的缓存接口定义。如果有私有编译的同名类型被优先加载,会和官方包的类型产生冲突,导致方法匹配失败。 - 清理全链路编译缓存后全量重建
执行以下操作排除增量编译、缓存残留的影响:- 删除解决方案下所有项目的
bin、obj目录 - 执行命令
dotnet nuget locals all --clear清空本地NuGet包缓存 - 重新执行NuGet包还原,全量重新编译解决方案
- 删除解决方案下所有项目的
- 排查部署环节的文件覆盖问题
如果异常是在发布部署后出现,检查部署流程的文件覆盖规则:如果部署时设置为「保留现有文件」,目标环境中遗留的旧版本Polly相关dll不会被新版本覆盖,会直接导致类型加载错误。需要手动清空目标部署目录下的所有旧文件后再重新发布。
内容的提问来源于stack exchange,提问作者Schwarzie2478
相关产品推荐
相关产品推荐

