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