类库(.NET Standard)和类库(.NET Core)区别及选择

在VS(Visual Studio)中可以创建3种类库项目(Class Library),包括类库(.NET Framework)、类库(.NET Standard)、类库(.NET Core),本文主要介绍.NET Standard类库(Class Library)和.NET Core类库(Class Library)的区别和它们的选择问题。

1、类库(.NET Standard)和类库(.NET Core)区别

相关文档https://docs.microsoft.com/en-us/dotnet/core/packages#package-based-frameworks

1) 兼容性

面向.NET Standard的库将在任何.NET Standard兼容的运行时上运行,例如,.NET Core,.NET Framework,Mono / Xamarin。另一方面,面向.NET Core的库只能在.NET Core运行时上运行。

2) API表面积(API Surface Area)

NETStandard.Library 提供了.NET Standard中的所有东西。而.NET Core libraries则包含了Microsoft.NETCore.App中的所有内容。后者包括大约20个其他库,我们可以将其中一些手动添加到我们的.NET Standard库中(例如,System.Threading.Thread),而其中一些与.NET Standard不兼容(例如,Microsoft.NETCore.CoreCLR)。

此外,.NET Core库指定运行时,并附带一个应用程序模型。例如,这对于使单元测试类库可运行非常重要。

2、类库(.NET Standard)和类库(.NET Core)的选择

决定是在兼容性和API访问之间进行权衡。

当想增加与库兼容的应用程序的数量时,可以使用.NET Standard库,并且可以减少库可以访问的.NET API表面积。

如果要增加库可以访问的.NET API表面积,请使用.NET Core库,并且可以只允许.NET Core应用程序与库兼容。

例如,面向.NET Standard 1.3的库将与面向.NET Framework 4.6,.NET Core 1.0,Universal Windows Platform 10.0以及支持.NET Standard 1.3的任何其他平台的应用程序兼容。但是,该库将无法访问.NET API的某些部分。例如,该 Microsoft.NETCore.CoreCLR软件包与.NET Core兼容,但与.NET Standard不兼容。

3、类库(.NET Standard)和类库(.NET Core)同时存在的原因

平台层面上,.NET Standard存在的原因是为了可移植性。它定义了.NET平台同意实施的一组API。任何实现.NET Standard的平台都与针对该.NET Standard的库兼容。.NET Core是这些兼容平台之一。

库的层面上,.NET标准库模板可以在多个运行时上运行(以API表面积为代价)。相反,.NET Core库模板的存在是为了访问更多API表面积(以兼容性为代价)并指定用于构建可执行文件的平台。

4、.NET Standard 和 .NET Platforms关系

通过代码接口之间继承说明它们之间的关系

using System;
namespace Analogy
{
//每个接口表示一个目标框架,方法表示该目标框架上可用的api组。
//目的是展示.NET Standard API surface和其他.NET platforms之间的关系

    // .NET Standard
    interface INetStandard10
    {
        void Primitives();
        void Reflection();
        void Tasks();
        void Collections();
        void Linq();
    }
    interface INetStandard11 : INetStandard10
    {
        void ConcurrentCollections();
        void InteropServices();
    }
    interface INetStandard12 : INetStandard11
    {
        void ThreadingTimer();
    }
    interface INetStandard13 : INetStandard12
    {
        void FileSystem();
        void Console();
        void ThreadPool();
        void Process();
        void Sockets();
        void AsyncLocal();
    }
    interface INetStandard14 : INetStandard13
    {
        void IsolatedStorage();
    }
    interface INetStandard15 : INetStandard14
    {
        void AssemblyLoadContext();
    }
    // .NET Framework 
    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();
    }
    interface INetFramework451 : INetFramework45, INetStandard12
    {
        // TODO: .NET Framework 4.5.1 specific APIs
    }
    interface INetFramework452 : INetFramework451, INetStandard12
    {
        // TODO: .NET Framework 4.5.2 specific APIs
    }
    interface INetFramework46 : INetFramework452, INetStandard13
    {
        // TODO: .NET Framework 4.6 specific APIs
    }
    interface INetFramework461 : INetFramework46, INetStandard14
    {
        // TODO: .NET Framework 4.6.1 specific APIs
    }
    interface INetFramework462 : INetFramework461, INetStandard15
    {
        // TODO: .NET Framework 4.6 specific APIs
    }
    // Mono
    interface IMono43 : INetFramework46
    {
        void MonoSpecificApi();
    }
    // Windows Universal Platform
    interface IWindowsUniversalPlatform : INetStandard14
    {
        void GPS();
        void Xaml();
    }
    // Xamarin 
    interface IXamarinIOS : INetStandard15
    {
        void AppleAPIs();
    }
    interface IXamarinAndroid : INetStandard15
    {
        void GoogleAPIs();
    }
    // .NET Core
    interface INetCoreApp10 : INetStandard15
    {
    }
    // Future platform
    interface ISomeFuturePlatform : INetStandard13
    {
        // A future platform chooses to implement a specific .NET Standard version.
        // All libraries that target that version are instantly compatible with this new
        // platform
    }
}

推荐阅读
cjavapy编程之路首页