为何无法将.NET Core 2.0项目引用添加到.NET Standard 2.0项目中?
这个问题其实是.NET平台设计上的常见限制,我来帮你拆解原因和解决办法:
为什么会出现这个错误?
.NET Standard是一套通用的API规范,定位是让类库能在不同.NET运行时(比如.NET Core、.NET Framework、Xamarin等)上跨平台运行。而.NET Core是具体的运行时实现,属于应用程序项目(或依赖特定运行时的类库)。按照设计规则:
- .NET Standard项目只能引用其他.NET Standard项目,或兼容它的更低版本.NET Standard库
- 具体运行时项目(比如.NET Core、.NET Framework应用)可以引用.NET Standard项目
你现在尝试让通用规范的项目去依赖具体运行时的项目,违反了这个依赖方向,所以MSBuild抛出了你看到的错误:
"Severity Code Description Project File Line Suppression State Error Project '..' targets 'netcoreapp2.0'. It cannot be referenced by a project that targets '.NETStandard,Version=v2.0'. ..Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets 1601 "
解决办法
根据你的项目需求,可选择以下方案:
调整目标框架(最直接)
如果你的.NET Core 2.0项目本质是类库(不是控制台/ASP.NET Core应用),可以把它的目标框架改成netstandard2.0:- 右键点击.NET Core项目 → 选择「属性」
- 在「应用程序」标签页,修改「目标框架」为
.NET Standard 2.0 - 保存后重新生成,两个项目都遵循.NET Standard规范,就能互相引用了
反转依赖关系(最符合设计原则)
如果你的.NET Core 2.0项目必须保留netcoreapp2.0(比如它是应用程序,用到了.NET Core特有API),正确做法是让NET Core 2.0项目引用.NET Standard 2.0项目——通用类库提供基础功能,具体应用依赖类库,这才是合理的依赖流向。多目标框架(兼顾两种场景)
如果你的.NET Core项目既要作为独立应用运行,又要给其他类库提供功能,可以设置它同时支持多个目标框架:- 右键项目 → 选择「编辑项目文件」(.csproj)
- 把原来的
<TargetFramework>netcoreapp2.0</TargetFramework>改成:<TargetFrameworks>netcoreapp2.0;netstandard2.0</TargetFrameworks> - 保存后重新生成,.NET Standard 2.0项目就能引用它的.NET Standard版本,同时它还能作为.NET Core应用正常运行。
内容的提问来源于stack exchange,提问作者Trax

