Azure Function V3运行报错:无法加载Microsoft.Extensions.DependencyModel 3.1.6.0程序集
问题根因
Azure Functions V3 进程内运行时采用了依赖隔离机制,会优先加载宿主环境自带的程序集,即使项目中显式引用了Microsoft.Extensions.DependencyModel包,生成阶段也可能被运行时的清理逻辑移除,或者运行时优先寻找宿主目录下的对应版本,找不到就抛出文件找不到异常。
可行修复方案
方案1:配置项目保留依赖包
- 在Function项目中显式安装对应版本的NuGet包:
Install-Package Microsoft.Extensions.DependencyModel -Version 3.1.6
- 打开项目的
.csproj文件,在PropertyGroup节点中添加以下两行配置:
<PropertyGroup> <!-- 原有配置保持不变 --> <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput> <FunctionsPreservedDependencies Include="Microsoft.Extensions.DependencyModel.dll" /> </PropertyGroup>
_FunctionsSkipCleanOutput会跳过Functions生成时的多余依赖清理逻辑,确保你引用的包被完整复制到输出目录FunctionsPreservedDependencies会告知运行时优先加载你项目中自带的对应程序集,不使用宿主自带的版本
方案2:绕开DependencyContext依赖(更稳定)
直接放弃使用DependencyContext获取程序集,改用遍历当前运行目录的dll文件加载,从根源上规避对该包的依赖,代码示例如下:
// 获取当前程序集运行目录 var runDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // 加载目录下所有业务相关的dll var allAssemblies = Directory.EnumerateFiles(runDir, "*.dll") // 可根据需要过滤系统程序集,减少不必要的加载 .Where(file => !Path.GetFileName(file).StartsWith("Microsoft.") && !Path.GetFileName(file).StartsWith("System.")) .Select(Assembly.LoadFrom) .ToList(); // 后续遍历allAssemblies即可获取你需要的类型,注册到ServiceCollection
方案3:本地调试临时修复
如果仅本地调试出现问题,发布到Azure环境后运行正常,可以在local.settings.json的Values节点中添加配置:
{ "Values": { // 原有配置保持不变 "WEBSITE_LOAD_USER_APPLICATION_DEPENDENCIES": "1" } }
该配置会强制本地运行时优先加载用户项目中自带的依赖包。
注意事项
- 开启
_FunctionsSkipCleanOutput后生成的输出包体积会有所增大,属于正常现象 - 使用遍历dll的方案时,可根据自己的业务需求调整过滤规则,避免加载不需要的第三方程序集
内容的提问来源于stack exchange,提问作者user351711
相关产品推荐
相关产品推荐

