引用.NET Framework 4.7.2的.NET 5项目Release下dotnet publish失败
问题根因
报错是因为 Microsoft.Bcl.Build 是面向 .NET Framework 的旧版 NuGet 包,它的 EnsureBindingRedirects 构建任务依赖 .NET Framework 专属的 Microsoft.Build.Utilities.v4.0 程序集。dotnet cli 自带的是跨平台 .NET 版 MSBuild,不包含这个 Framework 专属程序集,而 Visual Studio 使用的是完整 .NET Framework 版 MSBuild,所以 VS 构建正常、dotnet cli 构建失败。
省略 configuration 参数时默认走 Debug 配置,你的项目 Debug 配置未触发绑定重定向逻辑,所以可以正常构建。
解决方案(按优先级从高到低)
- 方案1:使用 Visual Studio 配套的 MSBuild 执行发布
直接用 VS 自带的 MSBuild 代替 dotnet cli 执行发布,兼容性最好,不需要修改项目代码,命令如下:
注意修改 MSBuild 路径为你本地 VS 实际安装路径,2019 版路径类似"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" .\MyProject.csproj /t:Publish /p:RuntimeIdentifier=win10-x64 /p:SelfContained=true /p:Configuration=ReleaseC:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe - 方案2:禁用旧版绑定重定向任务
如果要继续使用 dotnet cli 发布,可以在 .NET 5 项目的 .csproj 文件的<PropertyGroup>节点中添加以下配置,禁用报错的构建任务:
.NET 5+ 已经自带了依赖绑定逻辑,不需要旧版<SkipValidatePackageReferences>true</SkipValidatePackageReferences> <EnsureBindingRedirectsEnabled>false</EnsureBindingRedirectsEnabled>Microsoft.Bcl.Build的绑定重定向功能,禁用后不会影响项目运行。 - 方案3:移除旧版 BCL 包引用
检查所有被引用的 .NET Framework 4.7.2 项目,卸载其中的Microsoft.Bcl.Build、Microsoft.Bcl系列 NuGet 包。.NET Framework 4.7.2 已经内置了这些包提供的所有功能,不需要额外引用,移除后不会触发对应的构建任务。
内容的提问来源于stack exchange,提问作者Don Chambers
相关产品推荐
相关产品推荐

