在Visual Studio中,至少可以创建三种不同类型的类库:
- 类库(.NET Framework)
- 类库(.NET标准)
- 类库(.NET核心)
虽然第一个是我们多年来一直在使用的,但我一直困惑的一个主要问题是何时使用.NET标准和.NET核心类库类型。最近,当我尝试将不同的框架版本作为多个目标,并创建一个单元测试项目时,我被这一点所困扰
那么,类库(.NET-Standard)和类库(.NET-Core)之间有什么区别呢?为什么两者都存在?我们应该在什么时候使用它们
我们什么时候应该用一个来代替另一个
这个决定是兼容性和API访问之间的权衡
如果希望增加与库兼容的应用程序数量,并且希望减少库可以访问的.NET API表面积,请使用.NET标准库
如果希望增加库可以访问的.NET API表面积,并且只允许.NET Core应用程序与库兼容,请使用.NET Core库
例如,以.NET标准1.3为目标的库将与以.NET Framework 4.6、.NET Core 1.0、Universal Windows Platform 10.0和支持.NET标准1.3的任何其他平台为目标的应用程序兼容。不过,该库将无法访问.NETAPI的某些部分。例如,Microsoft.NETCore.CoreCLR包与.NET Core兼容,但与.NET标准不兼容
类库(.NET标准)和类库(.NET核心)之间有什么区别
兼容性:以.NET标准为目标的库将在任何符合.NET标准的运行时上运行,例如.NET核心、.NET框架、Mono/Xamarin。另一方面,以.NET Core为目标的库只能在.NET Core运行时上运行
API表面积:.NET标准库包含NETStandard.Library中的所有内容,而.NET核心库包含Microsoft.NETCore.App中的所有内容。后者包括大约20个附加库,其中一些库我们可以手动添加到.NET标准库中(例如System.Threading.Thread),还有一些库与.NET标准不兼容(例如Microsoft.NETCore.CoreCLR)
另外,.NET核心库还指定了一个运行时,并附带了一个应用程序模型。例如,使单元测试类库可运行非常重要
为什么两者都存在
暂时忽略库,.NET标准存在的原因是为了可移植性;它定义了一组.NET平台同意实现的API。任何实现.NET标准的平台都与针对该.NET标准的库兼容。其中一个兼容平台是.NETCore
回到库,现有的.NET标准库模板可以在多个运行时上运行(以牺牲API表面积为代价)。相反,.NET核心库模板的存在是为了访问更多的API表面积(以牺牲兼容性为代价),并指定一个平台来构建可执行文件
下面是一个交互式矩阵,它显示了哪个.NET标准支持哪个.NET实现以及有多少API表面积可用