.NET Core 3.1控制台应用程序集版本不匹配报FileNotFoundException如何解决
.NET Core 3.1控制台应用程序集版本不匹配导致FileNotFoundException处理说明
问题场景
原.NET Framework 4.8迁移至.NET Core 3.1的控制台应用,运行时抛出System.IO.FileNotFoundException崩溃。报错提示无法加载Microsoft.Extensions.FileProviders.Physical 3.1.0.0版本程序集,经核验:
- 控制台exe输出目录下存在同名DLL,但实际程序集版本为3.1.6.0
- 整个解决方案输出目录共包含1200+个DLL
- 同目录下的ASP.NET Core应用加载全部DLL时,未触发同类版本不匹配问题
已观察到的排查结果
- 全量1200+个项目的.csproj文件中,未直接检索到
Physical、Mvc.Abstractions相关字符串 - 全目录400+个.deps.json文件中,全部记录引用
Microsoft.Extensions.FileProviders.Physical3.1.0.0版本 - 控制台应用自身的.deps.json文件中,未提及
Microsoft.Extensions.FileProviders.Physical - 手动将3.1.0.0版本的目标DLL放入exe运行目录后,仍抛出相同的找不到3.1.0.0版本的异常
- 参考程序集解析方案编写如下自定义加载逻辑:
AssemblyLoadContext.Default.Resolving += (context, name) => { var dllPath = System.IO.Path.Combine(Environment.CurrentDirectory, name.Name + ".dll"); if (File.Exists(dllPath)) { return AssemblyLoadContext.Default.LoadFromAssemblyPath(dllPath); } return null; };
该逻辑可让250+个存在版本不匹配的程序集正常加载,但后续会触发Microsoft.AspNetCore.Mvc.Abstractions 3.1.0.0版本找不到的异常——该DLL本身不在exe周边输出目录中
- 诊断级MSBuild输出显示:
Microsoft.Extensions.FileProviders.Physical3.1.0.0版本,被项目内自有程序集A、B、C依赖,但这三个程序集的.csproj文件未声明对该DLL的引用Microsoft.AspNetCore.Mvc.Abstractions3.1.0.0版本,被上述自有程序集B依赖,且B的.csproj文件同样未声明对该DLL的引用
已验证无效的尝试
- 沿用.NET Framework绑定重定向方案:.NET Core无传统app.config形式的绑定重定向机制,尝试在控制台项目.csproj中添加如下配置,未对.deps.json生成结果、运行时异常产生任何影响:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
- 手动替换指定版本DLL到输出目录:未解决运行时加载失败问题
- 自定义程序集解析逻辑仅从当前运行目录扫描文件:无法解决不在输出目录的间接依赖加载问题
核心待解决问题
- 如何让.NET Core 3.1运行时自动加载已存在的3.1.6.0版本程序集,替代运行时请求的3.1.0.0版本
- 同目录下的ASP.NET Core应用是通过何种机制规避同类版本不匹配问题的
内容的提问来源于stack exchange,提问作者O. R. Mapper
相关产品推荐
相关产品推荐

