在Visual Studio中,至少有三种不同类型的类库可以创建:

类库(。净框架) 类库(。净标准) 类库(。净核心)

虽然第一种是我们已经使用多年的,但我一直困惑的一个主要问题是什么时候使用. net Standard和. net Core类库类型。最近当我尝试多目标不同的框架版本,并创建一个单元测试项目时,我就被这个问题咬了一口。

那么,类库(。NET标准)和类库(。NET Core),为什么两者都存在,什么时候我们应该使用其中一个而不是另一个?


当前回答

简短的回答是:

IAnimal == .NetStandard (General)
ICat == .NetCore (Less general)
IDog == .NetFramework (Specific / oldest and has the most features)

其他回答

net核心 . net Core是一个免费的、跨平台的、开源的托管框架实现。它支持四种类型的应用程序:控制台、ASP。NET核心、云和通用Windows平台(UWP)。Windows窗体和Windows Presentation Foundation(WPF)不是. net Core的一部分。

从技术上讲,. net Core只支持控制台应用程序。ASP。NET Core和UWP是建立在。NET Core之上的应用程序模型。

与。net Framework不同,. net Core不被认为是Windows组件。因此,更新以NuGet包的形式出现,而不是通过Windows Update。由于. net Core运行时是App-Local安装的,并且应用程序是通过包管理器更新的,因此应用程序可以与特定的. net Core版本相关联并单独更新。

net标准 托管框架的每个实现都有自己的一组基类库。基类库(BCL)包含异常处理、字符串、XML、I/O、网络和集合等类。

. net标准是实现BCL的规范。由于. net实现需要遵循这个标准,应用程序开发人员不必担心每个托管框架实现的BCL的不同版本。

框架类库(FCL),如WPF, WCF和ASP。NET不是BCL的一部分,因此不包括在。NET标准中。

. net标准和. net实现之间的关系就像HTML规范和浏览器之间的关系一样。第二个是第一个的实现。

因此,. net Framework、Xamarin和. net Core都在它们的托管框架中实现了BCL的. net标准。由于计算机行业将继续引入新的硬件和操作系统,将会有新的。net托管框架。该标准允许应用程序开发人员知道将有一组他们可以依赖的一致api。

每个. net版本都有一个。net标准的相关版本。

通过提供一致的api,将应用程序移植到不同的托管实现以及提供工具变得更加容易。

. net Standard被定义为一个单独的NuGet包,因为所有的。net实现都需要支持它。使用工具变得更容易,因为工具有一组一致的api可用于给定的版本。您还可以为多个. net实现构建一个库项目。

您还可以为平台特定的api构建. net标准包装器。

net框架

Windows窗体,ASP。NET和WPF应用程序必须使用。NET Framework库开发。

net标准

Xamarin, iOS和Mac OS X应用程序必须使用.NET标准库开发

net核心

通用Windows平台(UWP)和Linux应用程序必须使用。net核心库开发。 API是用c++实现的,你可以使用c++, VB。NET, c#, f#和JavaScript语言。网

前面的回答可能描述了关于。net Core、。net Standard和。net Framework之间区别的最好理解,所以我只想分享一下我在选择这个而不是那个时的经验。

在项目中,你需要混合。net框架,。net核心和。net标准。例如,当我们用。net Core 1.0构建系统时,。net Core还不支持windows服务托管。

第二个原因是我们使用的是不支持。net Core的活动报表。

因此,我们想要构建一个基础架构库,它可以用于。net Core (ASP。NET Core)和Windows服务和报告(。这就是为什么我们选择。NET Standard作为这类库的原因。 选择。net标准意味着你需要仔细考虑库中的每个类都应该是简单的,并且跨越。net(核心、框架和标准)。

结论:

. net标准的基础架构库和共享公共。这个库可以被. net Framework和. net Core引用。 . net框架不支持的技术,如活动报告,窗口服务(现在支持。net 3.0)。 . net核心的ASP。当然是NET Core。

微软刚刚宣布了。net 5:引入。net 5

每个框架都有自己的类库。

. net框架的基类库。 . net Core的核心库。 Xamarin的Mono类库。

微软决定将所有这些类库合并到一个可以在所有框架中实现的库中。为此,他们开发了。net标准。

微软决定做一个统一的框架,. net 5是。net核心和。net框架的统一框架。在。net 6中,他们也将Xamarin合并到。net MAUI项目中。

. net Framework, . net Core, Xamarin被统一为一个。net 6框架,所以不需要。net标准。. net标准的目标是拥有一个能在所有框架中工作的库。现在所有的框架都合并到了。net 6中。

我希望这将有助于理解。net标准API表面和其他。net平台之间的关系。每个接口表示一个目标框架,方法表示该目标框架上可用的api组。

namespace Analogy
{
    // .NET Standard

    interface INetStandard10
    {
        void Primitives();
        void Reflection();
        void Tasks();
        void Xml();
        void Collections();
        void Linq();
    }

    interface INetStandard11 : INetStandard10
    {
        void ConcurrentCollections();
        void LinqParallel();
        void Compression();
        void HttpClient();
    }

    interface INetStandard12 : INetStandard11
    {
        void ThreadingTimer();
    }

    interface INetStandard13 : INetStandard12
    {
        //.NET Standard 1.3 specific APIs
    }

    // And so on ...


    // .NET Framework

    interface INetFramework45 : INetStandard11
    {
        void FileSystem();
        void Console();
        void ThreadPool();
        void Crypto();
        void WebSockets();
        void Process();
        void Drawing();
        void SystemWeb();
        void WPF();
        void WindowsForms();
        void WCF();
    }

    interface INetFramework451 : INetFramework45, INetStandard12
    {
        // .NET Framework 4.5.1 specific APIs
    }

    interface INetFramework452 : INetFramework451, INetStandard12
    {
        // .NET Framework 4.5.2 specific APIs
    }

    interface INetFramework46 : INetFramework452, INetStandard13
    {
        // .NET Framework 4.6 specific APIs
    }

    interface INetFramework461 : INetFramework46, INetStandard14
    {
        // .NET Framework 4.6.1 specific APIs
    }

    interface INetFramework462 : INetFramework461, INetStandard15
    {
        // .NET Framework 4.6.2 specific APIs
    }

    // .NET Core
    interface INetCoreApp10 : INetStandard15
    {
        // TODO: .NET Core 1.0 specific APIs
    }
    // Windows Universal Platform
    interface IWindowsUniversalPlatform : INetStandard13
    {
        void GPS();
        void Xaml();
    }

    // Xamarin
    interface IXamarinIOS : INetStandard15
    {
        void AppleAPIs();
    }

    interface IXamarinAndroid : INetStandard15
    {
        void GoogleAPIs();
    }
    // 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
    }

}