如何自动重定向.NET Core类库版本 解决多版本引用冲突
BC32207 多版本EF Core引用冲突永久修复方案
错误本质
该错误是.NET项目程序集加载时的典型版本冲突:项目对Microsoft.EntityFrameworkCore同时存在两个版本的引用链路——手动给项目添加的直接引用是6.0.1.0,而项目依赖的其他NuGet包会自动拉取6.0.6.0的间接引用,两个版本同时存在时编译器无法确定加载哪个版本,就会抛出该错误,也是NuGet生态下DLL地狱的常见表现。
当前报错快速修复
- 右键BackendAPI项目,打开「管理NuGet程序包」面板
- 在已安装列表找到
Microsoft.EntityFrameworkCore,将版本升级到6.0.6或更高的6.x稳定版,和间接引用版本对齐 - 同步检查所有EF Core关联包(包括
Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools、Microsoft.EntityFrameworkCore.Design等),将其版本全部调整为和核心包完全一致的版本号,禁止同大版本下混装不同小版本 - 执行「清理解决方案」后重新生成项目,当前行报错会直接消失
注:EF Core同大版本的高版本完全向下兼容低版本API,升级后不需要修改ContainerController.vb里的业务代码。
永久避免同类DLL版本冲突的配置
- 启用中央包版本管理(CPM)
这是.NET官方提供的解决方案级版本统一机制,配置完成后整个解决方案下所有项目的NuGet包版本都在单个文件里统一声明,从根源上杜绝直接/间接引用、跨项目引用的版本不一致问题。
操作方式:在解决方案根目录新建名为Directory.Packages.props的文件,写入如下配置:
配置完成后,各个项目添加NuGet引用时不需要再单独指定版本号,编译时会自动读取中央配置的版本。<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <!-- 全局统一EF Core系列包版本,后续升级仅需修改此处版本号 --> <PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.26" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.26" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.26" /> <!-- 其余所有第三方NuGet包的版本统一在此处声明 --> </ItemGroup> </Project> - 开启自动绑定重定向
编辑BackendAPI项目的项目文件(.vbproj),在主<PropertyGroup>节点下添加如下两个配置,编译时会自动生成程序集绑定重定向规则,将所有旧版本的引用统一指向当前使用的版本,不需要手动修改配置文件里的重定向节点:<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> - 定期排查隐式版本冲突
日常维护时可以在包管理器控制台执行命令查看所有EF相关包的版本,及时发现版本不一致问题:
也可以在项目根目录执行CLI命令查看所有直接、间接引用的完整版本列表,定位是哪个依赖包拉取了冲突版本:Get-Package | Where-Object Id -Like '*EntityFrameworkCore*' | Select-Object Id, Versiondotnet list package --include-transitive - 规范引用方式
禁止直接通过浏览本地dll文件的方式给项目加程序集引用,所有第三方依赖全部通过NuGet包管理器安装,避免人工复制不同版本dll到输出目录引发的加载冲突。
内容的提问来源于stack exchange,提问作者user18928007
相关产品推荐
相关产品推荐

