如今各类 .NET 满天飞,别说新手了,连我这样的老手都差点被绕进去。到底什么是 .NET 呢?通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 这篇文章好长呀,不知道你看完了没有,其实最关键的是核心的几个概念,咱们从头梳理一下天然就清楚了。html
远在 2000 年的时候,微软就发布了 .NET 1.0。而后在 2001 年的时候就成为了国际标准。git
标准是须要实现的,微软对这个标准的第一个实现就是 .NET Framework,也是多年来咱们所熟悉的 .NET。可是,这个 .NET 的实现是基于 Windows 平台的,其中包含了大量基于 Windows 的实现,甚至许多 Windows 专有的内容,好比 GDI 支持等等。微软从前推广的 .NET 跨平台,其实,是在微软平台上的跨平台。因为 .NET Framework 是直接基于 Windows 平台的,因此,.NET Framework 的程序是不能真正跨平台的,好比运行在 Linux 上。github
.NET 确实是一个很是优秀的设计,它吸引了大量的开发者,因此,世界上还存在着许多其它的 .NET 实现。他们本身开发了基于 .NET 标准的其它实现,例如,很是著名的 Mono 就是一个由 Xamarin 公司(先前是Novell,最先为Ximian)所主持的自由开放源代码项目。windows
可是,包括微软本身的 .NET Framework 在内的各类 .NET 实现,看起来都是 .NET,甚至均可以使用 C# 来开发程序,都是面向对象的,实际上是各不兼容的,好比它们的底层所支持的 API 就各不相同。这致使的结果就是,你在各个平台上开发的程序集实际上是没法通用的。由于对于某个 API 来讲,有的平台支持,有的平台就不支持。post
虽然开发人员能够经过条件编译等手段来开发能够支持在各类 .NET 实现上通用的类库,显然这是一个艰巨的任务,你必需要清楚各个实现的各个版本到底支持了哪些 API。url
到 2014 年的时候,微软的策略转向了开源和跨平台,.NET Framework 显然没法作到这一点,.NET Core 横空出世,它是开源,彻底跨平台的 .NET 实现,也是微软的第二个主要 .NET 实现。如今问题来了,即便对于微软来讲,如今都有了两个主要的 .NET 实现了,到底哪一个是正宗的 .NET 的呢?spa
计算机领域有个概念,若是你不能统一它,就增长一个抽象层。微软又搞出一个 .NET Standard 的新概念。开放源代码
顾名思义,.NET Standard 就是 .NET 的标准,它是一组规范,定义了在 .NET 的实现中到底应该包括哪些 API ,你能够在这里查看这个标准的官方说明。其中的要点以下:设计
它的好处在于,开发人员不用再逐个平台的检查是否支持某个 API 了,只要看这个平台支持到了 .NET Standard 的哪一个版本就好了,只要目标平台支持某个 .NET Standard ,就能够确认你的类库能够跨 .NET 实现通用了。越高的 .NET Standard 版本包含的 API 越多,但通用性越差,由于不是全部的平台都支持这么多的 API,显然,越低的 .NET Standard 兼容性越好,由于它要求的 API 越少,因此,支持的平台也越多。orm
对于开发人员来讲,有了这个 .NET Standard,开发通用的类库天然简单多了。
微软给出了一个各个常见平台各个版本所支持的 .NET Standard 标准的列表。
.NET Standard. | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 2.0 |
---|---|---|---|---|---|---|---|---|
.NET 核心.NET Core | 1.01.0 | 1.01.0 | 1.01.0 | 1.01.0 | 1.01.0 | 1.01.0 | 1.01.0 | 2.02.0 |
.NET Framework 1.NET Framework 1 | 4.54.5 | 4.54.5 | 4.5.14.5.1 | 4.64.6 | 4.6.14.6.1 | 4.6.14.6.1 | 4.6.14.6.1 | 4.6.14.6.1 |
MonoMono | 4.64.6 | 4.64.6 | 4.64.6 | 4.64.6 | 4.64.6 | 4.64.6 | 4.64.6 | 5.45.4 |
Xamarin.iOSXamarin.iOS | 10.010.0 | 10.010.0 | 10.010.0 | 10.010.0 | 10.010.0 | 10.010.0 | 10.010.0 | 10.1410.14 |
Xamarin.MacXamarin.Mac | 3.03.0 | 3.03.0 | 3.03.0 | 3.03.0 | 3.03.0 | 3.03.0 | 3.03.0 | 3.83.8 |
Xamarin.AndroidXamarin.Android | 7.07.0 | 7.07.0 | 7.07.0 | 7.07.0 | 7.07.0 | 7.07.0 | 7.07.0 | 8.08.0 |
通用 Windows 平台Universal Windows Platform | 10.010.0 | 10.010.0 | 10.010.0 | 10.010.0 | 10.010.0 | 10.0.1629910.0.16299 | 10.0.1629910.0.16299 | 10.0.1629910.0.16299 |
WindowsWindows | 8.08.0 | 8.08.0 | 8.18.1 | |||||
Windows PhoneWindows Phone | 8.18.1 | 8.18.1 | 8.18.1 | |||||
Windows Phone SilverlightWindows Phone Silverlight | 8.08.0 |
.NET Framework 和 .NET Core 都是 .NET,只不过它们支持的 API 并不彻底一致。开发人员更加头疼了,都是微软的亲儿子,咱们应该选哪一个呢?
从支持程度来看,微软主要在推广 .NET Core,以支持跨平台应用,对 .NET Framework 的支持倒在其次。
.NET Core 从 2.0 开始追上 .NET Framework 的 API 数量,达到支持 .NET Standard 2.0 水平,更新速度明显快于 .NET Framework。刚刚发布的 .NET Core 2.1 中支持了 Span<T>,这个特性到明年的 .NET Framework 4.8 都不会支持。因此,新应用的开发应该首选 .NET Core。
不过,有一个问题你不得不考虑一下,.NET Core 是跨平台的,必须支持全部平台,所以,它不可能包含 Windows 特定的一些 API,好比注册表的访问,因此。理论上讲,若是你但愿在开发中使用一些 Windows 平台专员的 API,它是不会出如今 .NET Core 中的。
别担忧,微软在 .NET 2.0 开始,微软提供了 Microsoft.Windows.Compatibility 来解决这个问题,该包提供了额外的约 20000 API 以支持 Windows 平台。能够在 .NET Core 项目中,添加对这个包的引用。
Windows 兼容性包经过 NuGet 包 Microsoft.Windows.Compatibility 提供,可从面向 .NET Core 或 .NET Standard 的项目引用。它提供了约 20,000 个 API 以支持原来在 .NET Framework 中支持,可是在 .NET Standard 中没有的 API。
对于 NuGet 库中的包来讲,在发布于 2017/8/14 的 Announcing .NET Core 2.0 中,已经达到了约 70% 的支持度。
一图胜千言