.NET Core项目加载外部DLL时寻找低版本依赖组件问题排查
问题分析与解决方案
核心原因
- 程序集版本与NuGet版本不一致:多数NuGet包采用语义化版本号,但部分包会将程序集版本固定为「主版本.0.0.0」格式。比如System.IO.Abstractions 17.2.3的NuGet包版本是17.2.3,但编译生成的程序集版本可能是17.0.0.0。你的外部DLL编译时引用的是这个程序集版本,而非NuGet包显示的版本号,导致运行时寻找17.0.0.0。你可以右键查看17.2.3版本的System.IO.Abstractions.dll属性→详细信息,对比「文件版本」和「程序集版本」确认这点。
- .NET Core中绑定重定向配置无效:你添加的
<AutoGenerateBindingRedirects>是.NET Framework的配置逻辑,.NET Core/.NET 5+默认使用依赖项解析机制,除非是兼容模式的旧版项目,否则该配置不会生效。 - 依赖项版本未统一:项目中可能存在其他间接依赖组件强制要求加载17.0.0.0版本,或者NuGet还原时未正确合并版本,导致运行时无法定位匹配的程序集。
解决办法
显式指定程序集版本重定向
在项目的csproj中添加运行时配置选项,强制将旧版本重定向到17.2.3:<ItemGroup> <RuntimeHostConfigurationOption Include="assemblyBinding:System.IO.Abstractions" Value="17.2.3" /> </ItemGroup>或者创建
runtimeconfig.template.json文件,添加绑定重定向规则:{ "configProperties": { "assemblyBinding": { "dependentAssembly": [ { "assemblyIdentity": { "name": "System.IO.Abstractions", "publicKeyToken": "96bf224d23c43e59", "culture": "neutral" }, "bindingRedirect": { "oldVersion": "0.0.0.0-17.0.0.0", "newVersion": "17.2.3" } } ] } } }强制统一依赖版本
在项目csproj中直接显式引用System.IO.Abstractions 17.2.3,让NuGet自动统一所有依赖的版本:<PackageReference Include="System.IO.Abstractions" Version="17.2.3" />执行以下命令清理并重新还原项目:
dotnet clean dotnet restore检查程序集复制与依赖真实性
使用ILSpy或dnSpy反编译外部DLL,确认其实际引用的程序集版本。如果17.2.3版本的System.IO.Abstractions.dll程序集版本确实是17.0.0.0,检查项目输出目录是否存在该DLL,确保其「复制本地」属性已开启(在引用的NuGet包属性中设置)。
内容的提问来源于stack exchange,提问作者rory
相关产品推荐
相关产品推荐

