.NET Core 3.1 Jenkins发布后出现程序集版本不匹配无法加载错误
根因说明
你遇到的是多项目批量发布到同一输出目录的典型同名DLL覆盖问题:dotnet publish对整解决方案执行发布并指定统一输出目录时,会按照项目的编译发布顺序依次复制输出文件,后完成发布的项目如果携带了低版本的同名DLL,会直接覆盖先发布项目的高版本DLL。你单独查看每个项目bin目录版本正常,是因为单个项目独立发布时没有被其他项目的文件覆盖,仅汇总输出时才会出现版本错误。
解决建议
- 调整发布逻辑,不要直接对解决方案执行带统一输出目录的publish操作:改为逐个项目发布,将主入口项目放在最后一步发布,保证主项目依赖的高版本DLL不会被其他项目的低版本文件覆盖。
- 新增统一版本绑定配置:在解决方案根目录新增
Directory.Build.props文件,全局强制指定该包的引用版本,配置内容如下:
<Project> <ItemGroup> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" Explicit="True" /> </ItemGroup> </Project>
该配置会自动作用于解决方案下所有项目,强制所有项目统一引用5.0.0版本的包,从源头避免多版本引用的问题。
- 新增SDK版本锁定配置:在解决方案根目录新增
global.json文件,指定构建使用的SDK版本,避免构建机器多版本SDK带来的引用混乱,配置示例:
{ "sdk": { "version": "3.1.403", "rollForward": "disable" } }
- 输出详细构建日志定位问题项目:在现有
dotnet publish命令中添加-v diag参数,生成详细构建日志,搜索日志中Microsoft.Extensions.DependencyInjection.Abstractions.dll的复制操作记录,可直接定位到是哪个项目将低版本DLL复制到了最终输出目录,针对性调整该项目的引用配置。 - 临时兜底方案:在Jenkins构建流程的publish步骤之后,新增一步文件复制操作,手动将主项目bin目录下的正确版本
Microsoft.Extensions.DependencyInjection.Abstractions.dll复制到最终输出目录,强制覆盖错误版本。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

