使用dotnet build构建net47的Microsoft.NET.Sdk项目遇缺失目标包错误,求解决方案
解决dotnet build构建.NET Framework 4.7 SDK风格项目的引用程序集缺失问题
我之前也碰到过一模一样的情况,给你几个实用的解决办法:
1. 非Windows环境(Linux/macOS)的核心方案
从你的错误路径/usr/local/share/dotnet来看,你应该是在类Unix系统上操作。这类系统没有官方的.NET Framework引用程序集,所以dotnet build找不到对应的依赖。最省心的处理方式是给项目添加专门的NuGet引用包:
在你的.csproj文件里加入下面的配置:
<ItemGroup> <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies.net47" Version="1.0.3" PrivateAssets="All" /> </ItemGroup>
PrivateAssets="All"的作用是让这个包只在当前项目构建时生效,不会被传递给其他依赖此项目的组件——毕竟它只是用来提供框架引用集的,不需要随项目发布。
添加完成后,先执行dotnet restore拉取包,再运行dotnet build就能正常构建了。
2. Windows环境的两种选择
如果你是在Windows上操作,有两个方向可选:
- 安装官方目标包:打开Visual Studio安装器,选择「修改」你的VS实例,在「单个组件」里找到并勾选
.NET Framework 4.7 目标包,完成安装后dotnet build就能识别到框架引用了。 - 复用NuGet包方案:和非Windows环境一样,添加
Microsoft.NETFramework.ReferenceAssemblies.net47包,这种方式不需要依赖Visual Studio的组件安装,更适合CI/CD等自动化场景。
为什么msbuild能正常构建?
顺带解释下:msbuild能跑通是因为它在Windows上默认会读取Visual Studio安装的框架引用集;如果是在类Unix系统上装了Mono,它会复用Mono提供的.NET Framework兼容引用集。而dotnet build本身是针对.NET Core/.NET 5+设计的,默认不会自动关联这些引用,所以需要我们手动补充。
内容的提问来源于stack exchange,提问作者jbtule




