将现有.NET Core 3.1项目添加到Azure Function项目时报错的解决求助
该报错由Azure Functions运行时的程序集加载机制导致:Azure Functions宿主会默认优先加载自身内置的Microsoft.Extensions.*系列依赖包,版本与函数项目的运行时版本严格绑定。你引用的.NET Core 3.1类库如果直接或间接依赖了高于运行时内置版本的Microsoft.Extensions相关包,就会触发程序集找不到的错误,本次报错的Microsoft.Extensions.Primitives 5.0.0.0就属于高于.NET Core 3.1对应Azure Functions v3内置版本的依赖。
- 首先确认Azure Function项目的基础配置:打开函数项目的
.csproj文件,检查<TargetFramework>是否为netcoreapp3.1,<AzureFunctionsVersion>是否为v3,保证运行时版本匹配。 - 执行命令
dotnet list package查看你要引用的类库的所有直接依赖,确认是否有版本高于3.1.x的Microsoft.Extensions.*系列包。 - 执行命令
dotnet list package --include-transitive查看类库的所有传递依赖,定位具体是哪个包引入了高版本的Microsoft.Extensions.Primitives依赖。
方案1:统一依赖版本(优先推荐)
将类库项目中所有Microsoft.Extensions.*系列包的版本降级到3.1.x版本,和Azure Functions v3运行时的内置版本保持一致。如果是第三方包引入的高版本传递依赖,可以在类库或者函数项目中显式安装3.1.x版本的对应Microsoft.Extensions包,覆盖传递依赖的版本号即可。
方案2:修改函数项目构建配置
如果无法修改类库的依赖版本,可以在函数项目的.csproj文件的<PropertyGroup>节点中添加以下3行配置:
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>
上述配置会开启自动绑定重定向,同时避免函数构建过程中自动删除你引入的高版本依赖程序集,可解决绝大多数版本冲突类的程序集找不到问题。
方案3:升级函数运行时版本
如果类库必须使用5.x及以上版本的依赖,可以将Azure Function项目升级到v4版本,目标框架改为.NET 6及以上版本,高版本运行时内置的Microsoft.Extensions系列包版本更高,可兼容更高版本的依赖需求。
内容的提问来源于stack exchange,提问作者Paul

