1、类库(.NET Standard)和类库(.NET Core)区别
相关文档:https://docs.microsoft.com/en-us/dotnet/core/packages#package-based-frameworks
.NET Standard 是一套 API 规范,定义了在不同 .NET 实现(如 .NET Framework、.NET Core、Xamarin 等)之间共享的一组通用 API。.NET Core 是一个跨平台的、高性能的、开源的 .NET 实现。从 .NET 5 开始,微软将 .NET Core、.NET Framework 和 Xamarin 统一为单一的 .NET 平台。
1) 兼容性
.NET Standard是一个API规范,旨在确保库可以在所有.NET实现中运行,包括.NET Core、.NET Framework和Mono/Xamarin等。这意味着开发者可以编写一次代码,并在多个平台上重用,增强了库的兼容性。
.NET Core 是一个特定的运行时环境,专注于跨平台的应用程序开发。面向.NET Core的库只能在.NET Core运行时上运行,因此其兼容性相对较低。
2) API表面积 (API Surface Area)
.NET Standard 通过NETStandard.Library提供了所有标准API。这意味着它包含了所有.NET Standard定义的功能,确保库的广泛可用性。
.NET Core 库中包含的API来自于Microsoft.NETCore.App,该框架包括许多附加库(约20个),这些库有些可以手动添加到.NET Standard库中(例如,System.Threading.Thread),但有些库(如Microsoft.NETCore.CoreCLR)与.NET Standard不兼容。因此,在选择使用.NET Standard或.NET Core时,开发者需要考虑到API的可用性和兼容性。
2、类库(.NET Standard)和类库(.NET Core)的选择
.NET Standard 的主要优势在于跨平台兼容性。它定义了一个 API 标准,旨在提高库的兼容性,从而让同一个库可以在 .NET Framework、.NET Core、Mono 等多个平台上运行。然而,这种兼容性是以牺牲某些平台特定功能为代价的,导致库能够访问的 API 表面积较小。例如,面向 .NET Standard 1.3 的库将能够在 .NET Framework 4.6、.NET Core 1.0 等平台上使用,但受限于部分 API 的访问。
.NET Core 则提供了更广泛的 API 表面积,适用于构建更现代化、性能更高的应用程序,但它仅限于与 .NET Core 平台兼容。如果应用主要目标是使用 .NET Core 特性或在 .NET Core 环境中运行,那么可以选择 .NET Core 库,以便利用其完整的 API 集。例如,Microsoft.NETCore.CoreCLR 包可用于 .NET Core 项目,但不兼容 .NET Standard。
3、类库(.NET Standard)和类库(.NET Core)同时存在的原因
1)跨平台兼容性
如库需要跨多个 .NET 平台(比如 .NET Framework、Mono、.NET Core 等)使用,选择 .NET Standard 是最合适的选择,通常使用 .NET Standard 2.0 能保证广泛的兼容性。
2)专注于 .NET Core/.NET 6+ 环境
如库只会在现代化的 .NET 环境中使用,例如只在 .NET Core 3.1 或 .NET 6+ 上运行,直接使用这些具体的框架版本,可以更好地利用这些平台的特性和新 API。
3)项目类型
如开发的是基础工具库,希望能够被多种类型的应用程序使用(例如传统桌面应用、Web 应用、移动应用),建议使用 .NET Standard。如开发的是现代化应用程序,尤其是面向性能、容器化、跨平台的应用程序,使用 .NET Core/.NET 6+ 会更合适。
4、.NET Standard 和 .NET Platforms关系
.NET Standard 是一个 API 规范,定义了一组所有 .NET 平台都应实现的通用 API。它的主要目的是确保代码可以在不同的 .NET 平台(如 .NET Framework、.NET Core、Xamarin 等)之间共享和复用。
通过代码接口之间继承说明它们之间的关系
using System; namespace Analogy { // 每个接口表示一个目标框架,方法表示该目标框架上可用的 API 组。 // 目的是展示 .NET Standard API 表面和其他 .NET 平台之间的关系。 // .NET Standard // .NET Standard 1.0 interface INetStandard10 { void Primitives(); void Reflection(); void Tasks(); void Collections(); void Linq(); } // .NET Standard 1.1 interface INetStandard11 : INetStandard10 { void ConcurrentCollections(); void InteropServices(); } // .NET Standard 1.2 interface INetStandard12 : INetStandard11 { void ThreadingTimer(); } // .NET Standard 1.3 interface INetStandard13 : INetStandard12 { void FileSystem(); void Console(); void ThreadPool(); void Process(); void Sockets(); void AsyncLocal(); } // .NET Standard 1.4 interface INetStandard14 : INetStandard13 { void IsolatedStorage(); } // .NET Standard 1.5 interface INetStandard15 : INetStandard14 { void AssemblyLoadContext(); } // .NET Framework // .NET Framework 4.5 interface INetFramework45 : INetStandard11 { void FileSystem(); void Console(); void ThreadPool(); void Crypto(); void WebSockets(); void Process(); void Sockets(); void AppDomain(); void Xml(); void Drawing(); void SystemWeb(); void WPF(); void WindowsForms(); void WCF(); } // .NET Framework 4.5.1 interface INetFramework451 : INetFramework45, INetStandard12 { // TODO: .NET Framework 4.5.1 特定的 API } // .NET Framework 4.5.2 interface INetFramework452 : INetFramework451, INetStandard12 { // TODO: .NET Framework 4.5.2 特定的 API } // .NET Framework 4.6 interface INetFramework46 : INetFramework452, INetStandard13 { // TODO: .NET Framework 4.6 特定的 API } // .NET Framework 4.6.1 interface INetFramework461 : INetFramework46, INetStandard14 { // TODO: .NET Framework 4.6.1 特定的 API } // .NET Framework 4.6.2 interface INetFramework462 : INetFramework461, INetStandard15 { // TODO: .NET Framework 4.6.2 特定的 API } // Mono // Mono 4.3 interface IMono43 : INetFramework46 { void MonoSpecificApi(); } // Windows Universal Platform interface IWindowsUniversalPlatform : INetStandard14 { void GPS(); void Xaml(); } // Xamarin // Xamarin.iOS interface IXamarinIOS : INetStandard15 { void AppleAPIs(); } // Xamarin.Android interface IXamarinAndroid : INetStandard15 { void GoogleAPIs(); } // .NET Core // .NET Core App 1.0 interface INetCoreApp10 : INetStandard15 { } // Future platform interface ISomeFuturePlatform : INetStandard13 { // 一个未来的平台选择实现特定版本的 .NET Standard。 // 所有针对该版本的库将立即与此新平台兼容。 } }