如果您想增加与您的库兼容的应用程序的数量,并且可以减少您的库可以访问的. NET API表面积,请使用. NET标准库。
当您想要增加您的库可以访问的. NET API表面积时,请使用. NET Core库,并且您可以只允许. NET Core应用程序与您的库兼容。
例如,以. NET Framework 4.6、. NET Core 1.0、Universal Windows Platform 10.0和任何其他支持. NET Standard 1.3的平台为目标的. NET Standard 1.3将与应用程序的库。但是,该库将无法访问. NET API的某些部分。例如,Microsoft.NETCore.CoreCLR包与. NET Core兼容,但与. NET Standard不兼容。
类库(. NET Standard)和类库(. NET Core)有什么区别?
兼容性:以. NET Standard为目标的库将在任何符合. NET Standard的运行时上运行,例如. NET Core、. NET Framework、Mono/Xamarin。另一方面,以. NET Core为目标的库只能在. NET Core运行时上运行。
API表面积:. NET Standard库包含NETStandard.Library中的所有内容,而. NET Core库包含Microsoft.NETCore.App中的所有内容。后者包括大约20个额外的库,其中一些我们可以手动添加到我们的. NET Standard库(例如System.Threading.Thread),其中一些与. NET Standard不兼容(例如Microsoft.NETCore.CoreCLR)。
此外,. NET Core库指定了运行时并附带了应用程序模型。例如,这对于使单元测试类库可运行很重要。
为什么两者都存在?
暂时忽略库,. NET Standard存在的原因是可移植性;它定义了一组. NET平台同意实现的API。任何实现. NET Standard的平台都与以. NET Standard为目标的库兼容。其中一个兼容平台是. NET Core。
回到库,. NET标准库模板的存在是为了在多个运行时上运行(以牺牲API表面积为代价)。相反,. NET Core库模板的存在是为了访问更多的API表面积(以牺牲兼容性为代价)并指定用于构建可执行文件的平台。
这是一个交互式矩阵,显示哪个. NET Standard支持哪个. NET实现以及可用的API表面积。
. NET标准是一组API库和程序集必须可用的规范。为. NET Standard 1.0编写的应用程序应该能够使用任何版本的Framework、Core、Mono等编译和运行,这些版本宣传支持. NET Standard 1.0库集合。. NET Standard 1.1、1.5、1.6、2.0等也是如此。只要运行时为您的程序所针对的Standard版本提供支持,您的程序就应该在那里运行。
针对Standard版本的项目将无法使用该标准修订版中未包含的功能。这并不意味着您不能依赖于其他程序集或其他供应商发布的API(即:NuGet上的项目)。但这确实意味着您采用的任何依赖项还必须包括对您的. NET Standard… NET Standard版本的支持。NET Standard正在快速发展,但它仍然足够新,并且足够关心一些较小的运行时配置文件,这种限制可能会令人窒息。(请注意一年半之后:这种情况开始发生变化,最近的. NET Standard版本更好,功能更全面)。
. NET Standard:将其视为一个大型标准库。将其用作依赖项时,您只能生成库(. DLL),而不能生成可执行文件。使用. NET标准作为依赖项创建的库可以添加到Xamarin. Android、Xamarin. iOS、. NET Core Windows/OS X/Linux项目中。
. NET Core:把它看作是旧的. NET框架的延续,只是它是开源的,有些东西还没有实现,有些东西已经被弃用了。它用额外的功能扩展了. NET标准,但它只能在桌面上运行。当添加它作为依赖项时,你可以在Windows、Linux和OS X上制作可运行的应用程序。(虽然现在只是控制台,没有GUI)。所以. NET Core=. NET Standard+桌面特定的东西。
因此,使用. NET Framework,您可以使用所有. NET工具,但您只能针对Windows应用程序(UWP、windows窗体、ASP.NET等)。由于. NET Framework是闭源的,因此对此无能为力。
使用. NET Core,您的工具更少,但您可以针对主要桌面平台(Windows,Linux和Mac)。这在ASP.NETCore应用程序中特别有用,因为您现在可以在Linux上托管ASP.NET(托管价格更便宜)。现在,由于. NET Core是开源的,从技术上讲,为其他平台开发库是可能的。但由于没有支持它的框架,我认为这不是一个好主意。
使用. NET Standard,您的工具甚至更少,但您可以针对所有/大多数平台。由于Xamarin,您可以针对移动,由于Mono/Unity,您甚至可以针对游戏机。使用UNO平台和Blazor也可以针对Web客户端(尽管两者现在都有点实验)。
前面的答案可能描述了对. NET Core、. NET Standard和. NET Framework之间差异的最佳理解,所以我只想分享我在选择这个而不是那个时的经验。
在您需要在. NET Framework、. NET Core和. NET Standard之间混合的项目中。例如,在我们使用. NET Core 1.0构建系统时,不支持使用. NET Core托管Windows服务。
下一个原因是我们使用的是不支持. NET Core的Active Report。
因此,我们希望构建一个可用于. NET Core(ASP.NETCore)和Windows服务和报告(. NET Framework)的基础结构库->这就是我们选择. NET Standard作为此类库的原因。选择。NET标准意味着您需要仔细考虑库中的每个类都应该简单且交叉。NET(核心、框架和标准)。
结论:
. NET标准的基础结构库和共享公共。此库可由. NET Framework和. NET Core引用。
. NET Framework用于不受支持的技术,如Active Report、Windows Services(现在支持. NET 3.0)。
. NET Core. NET Core是托管框架的免费、跨平台、开源实现。它支持四种类型的应用程序:控制台、ASP.NET核心、云和通用Windows平台(UWP)。Windows窗体和Windows演示基础(WPF)不是. NET Core的一部分。
从技术上讲,. NET Core仅支持控制台应用程序。ASP.NETCore和UWP是构建在. NET Core之上的应用程序模型。
与. NET Framework不同,. NET Core不被视为Windows组件。因此,更新以NuGet包的形式出现,而不是通过Windows Update。由于. NET Core运行时已安装App-Local,并且应用程序通过包管理器进行更新,因此应用程序可以与特定的. NET Core版本相关联并单独更新。
. NET Standard托管框架的每个实现都有自己的一组基类库。基类库(BCL)包含异常处理、字符串、XML、I/O、网络和集合等类。