Azure Function中AddKeyedSingleton程序集加载失败问题求助
解决Azure Function中Microsoft.Extensions.DependencyInjection 8.0.0加载失败问题
问题分析
你的Azure Function基于.NET 6.0和Functions Runtime v4,使用AddKeyedSingleton需依赖Microsoft.Extensions.DependencyInjection 8.0.0,但运行时出现程序集找不到的错误。核心原因是Functions Runtime可能自带低版本DI程序集引发版本冲突,同时代码中存在配置构建、扩展方法调用的潜在问题。
解决方案
1. 修复扩展方法调用错误
AddInfrastructure是扩展方法,调用时无需重复传入services参数,修改ConfigureServices中的调用代码:
// 原错误调用 services.AddInfrastructure(services, configuration); // 修改为 services.AddInfrastructure(configuration);
2. 添加程序集版本绑定重定向
在项目根目录创建runtimeconfig.template.json文件,强制运行时加载8.0.0版本的DI程序集:
{ "runtimeOptions": { "assemblyBinding": { "dependencies": [ { "name": "Microsoft.Extensions.DependencyInjection", "publicKeyToken": "adb9793829ddae60", "version": "8.0.0.0" }, { "name": "Microsoft.Extensions.DependencyInjection.Abstractions", "publicKeyToken": "adb9793829ddae60", "version": "8.0.0.0" } ] } } }
3. 优化Configuration构建逻辑
原代码中services.BuildServiceProvider().GetRequiredService<IConfiguration>()会提前构建ServiceProvider,易引发版本冲突,直接使用Functions提供的配置实例:
修改Startup.cs的Configure方法:
public void Configure(IWebJobsBuilder builder) { // 直接获取Functions已配置好的IConfiguration var configuration = builder.Configuration; ConfigureServices(builder.Services, configuration); } private void ConfigureServices(IServiceCollection services, IConfiguration configuration) { // 无需重新构建Configuration,直接使用传入的实例 services.AddInfrastructure(configuration); }
4. 确认依赖兼容性并清理重建
- 执行以下命令检查所有依赖包版本,排查是否存在冲突的低版本DI依赖:
dotnet list package --include-transitive - 删除项目的
bin和obj文件夹,清理NuGet缓存后重新构建:dotnet clean dotnet nuget locals all --clear dotnet build
5. 检查Functions Runtime环境
- 本地运行时,确保Azure Functions Core Tools为最新v4.x版本;
- 部署到Azure时,确认App Service的Functions Runtime版本设置为v4,且.NET版本匹配.NET 6.0。
内容的提问来源于stack exchange,提问作者Juhi Shrivastava
相关产品推荐
相关产品推荐

