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

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

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

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


当前回答

前面的回答可能描述了关于。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

其他回答

另一种解释这种差异的方法是用现实世界的例子,因为我们大多数凡人都会使用现有的工具和框架(Xamarin, Unity等)来完成工作。

因此,有了。net框架,你可以使用所有的。net工具,但你只能针对Windows应用程序(UWP, Windows窗体,ASP。网,等等)。由于. net框架是闭源的,所以没有太多的事情可以做。

使用。net Core,你有更少的工具,但你可以瞄准主要的桌面平台(Windows、Linux和Mac)。这在ASP中特别有用。asp.net核心应用程序,因为你现在可以托管ASP。NET在Linux上(更便宜的主机价格)。现在,由于. net Core是开源的,从技术上讲,为其他平台开发库是可能的。但由于没有框架支持它,我不认为这是一个好主意。

使用. net Standard,你的工具就更少了,但是你可以针对所有/大多数平台。因为Xamarin,你可以瞄准手机,因为Mono/Unity,你甚至可以瞄准游戏机。也可以通过UNO平台和Blazor来定位web客户端(尽管目前两者都处于实验阶段)。

在实际应用程序中,您可能需要使用所有这些方法。例如,我开发了一个具有以下架构的销售点应用程序:

同时共享server和silent:

处理应用程序模型的. net标准库。 一个. net标准库,用于处理客户端发送的数据的验证。

由于它是一个。net标准库,它可以用于任何其他项目(客户端和服务器)。

在. net标准库上进行验证还有一个很好的优点,因为我可以确保在服务器和客户端上应用相同的验证。服务器是必须的,而客户端是可选的,有助于减少流量。

服务器端(Web API):

处理所有数据库连接的。net Standard(也可以是。net Core)库。 处理Rest API并使用。net Core项目 图书馆数据库。

由于这是在. net Core中开发的,所以我可以在Linux服务器上托管应用程序。

客户端(MVVM与WPF + Xamarin。Android / iOS形式):

A .NET Standard library that handles the client API connection. A .NET Standard library that handles the ViewModels logic. It is used in all the views. A .NET Framework WPF application that handles the WPF views for a windows application. WPF applications can be .NET core now, although they only work on Windows currently. AvaloniaUI is a good alternative for making desktop GUI applications for other desktop platforms. A .NET Standard library that handles Xamarin forms views. A Xamarin Android and Xamarin iOS project.

所以你可以看到在应用程序的客户端有一个很大的优势,因为我可以重用。net标准库(客户端API和ViewModels),并且只为WPF、Xamarin和iOS应用程序创建不带逻辑的视图。

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标准包装器。

简短的回答是:

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

. net Framework和. net Core都是框架。

. net Standard是一个标准(换句话说,是一个规范)。

您可以创建一个可执行项目(如控制台应用程序或ASP。NET应用程序)与。NET框架和。NET核心,但不与。NET标准。

使用. net Standard,你只能创建一个不能独立执行的类库项目,它应该被另一个。net Core或。net Framework可执行项目引用。

前面的回答可能描述了关于。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