一文搞清到底什么是 .NET?

一文搞清到底什么是 .NET?

现在各种 .NET 满天飞,别说新手了,连我这样的老手都差点被绕进去。到底什么是 .NET 呢?通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? 这篇文章好长呀,不知道你看完了没有,其实最关键的是核心的几个概念,我们从头梳理一下自然就清楚了。

.NET Framework 时代

远在 2000 年的时候,微软就发布了 .NET 1.0。然后在 2001 年的时候就成为了国际标准。

标准是需要实现的,微软对这个标准的第一个实现就是 .NET Framework,也是多年来我们所熟悉的 .NET。但是,这个 .NET 的实现是基于 Windows 平台的,其中包含了大量基于 Windows 的实现,甚至许多 Windows 专有的内容,比如 GDI 支持等等。微软从前推广的 .NET 跨平台,其实,是在微软平台上的跨平台。由于 .NET Framework 是直接基于 Windows 平台的,所以,.NET Framework 的程序是不能真正跨平台的,比如运行在 Linux 上。

多样化的 .NET 实现

.NET 确实是一个非常优秀的设计,它吸引了大量的开发者,所以,世界上还存在着许多其它的 .NET 实现。他们自己开发了基于 .NET 标准的其它实现,例如,非常著名的 Mono 就是一个由 Xamarin 公司(先前是Novell,最早为Ximian)所主持的自由开放源代码项目。

但是,包括微软自己的 .NET Framework 在内的各种 .NET 实现,看起来都是 .NET,甚至都可以使用 C# 来开发程序,都是面向对象的,其实是各不兼容的,比如它们的底层所支持的 API 就各不相同。这导致的结果就是,你在各个平台上开发的程序集其实是无法通用的。因为对于某个 API 来说,有的平台支持,有的平台就不支持。

虽然开发人员可以通过条件编译等手段来开发可以支持在各种 .NET 实现上通用的类库,显然这是一个艰巨的任务,你必须要清楚各个实现的各个版本到底支持了哪些 API。

.NET Standard 和 .NET Core

到 2014 年的时候,微软的策略转向了开源和跨平台,.NET Framework 显然无法做到这一点,.NET Core 横空出世,它是开源,完全跨平台的 .NET 实现,也是微软的第二个主要 .NET 实现。现在问题来了,即使对于微软来说,现在都有了两个主要的 .NET 实现了,到底哪个是正宗的 .NET 的呢?

计算机领域有个概念,如果你不能统一它,就增加一个抽象层。微软又搞出一个 .NET Standard 的新概念。

顾名思义,.NET Standard 就是 .NET 的标准,它是一组规范,定义了在 .NET 的实现中到底应该包括哪些 API ,你可以在这里查看这个标准的官方说明。其中的要点如下:

  • 为所有的 .NET 实现定义一组统一的基础类库支持的 API
  • 使得开发人员能够基于这个标准开发可以在各种 .NET 中使用的可移植库

它的好处在于,开发人员不用再逐个平台的检查是否支持某个 API 了,只要看这个平台支持到了 .NET Standard 的哪个版本就行了,只要目标平台支持某个 .NET Standard ,就可以确认你的类库可以跨 .NET 实现通用了。越高的 .NET Standard 版本包含的 API 越多,但通用性越差,因为不是所有的平台都支持这么多的 API,显然,越低的 .NET Standard 兼容性越好,因为它要求的 API 越少,所以,支持的平台也越多。

对于开发人员来说,有了这个 .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 Core 与 .NET Framework 的选择

.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% 的支持度。

总结

  • 对于 .NET 来说,首先要认识到 .NET Standard 是 .NET 的标准,这个标准有自己版本号,目前的版本是 2.0。
  • 在这个 .NET Standard 标准之下,有许多 .NET 的实现,比较著名的就是 .NET Framework 和 .NET Core 了,它们各自有各自的实现版本,目前 .NET Framewrok 是 4.7.2,而 .NET Core 则是 2.1。查看这里的说明。
  • API 最丰富的就是 .NET Framework 了,不过它仅支持 Windwos 平台。
  • .NET Core 的 2.1 版本,加上 Microsoft.Windows.Compatibility 这个包,已经很接近 .NET Framework 的支持水平,NuGet 中的类库也已经绝大多数支持了 .NET Core, 微软还在疯狂的填补这个差距。
  • 如果是新的项目,强烈建议基于 .NET Core 开发
  • 当前使用 Visual Studio 和 Visual Studio Code 都可以开发 .NET Core 应用

一图胜千言

一文搞清到底什么是 .NET?

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101574.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最常用MySql数据库备份恢复

    最常用MySql数据库备份恢复1、数据备份类型:·完全备份:故名思议备份整个数据库·部分备份:备份一部分数据集;·增量备份:自上次备份以来的改变数据的备份;                                                ·差异备份:自上次完全备份后改变数据的备份;2、数据备份的方式:                  存储引擎支持 MyISAM  Innodb·热备份:数据库启动,…

    2022年5月22日
  • Log4J 配置文件 指定类 properties

    Log4J 配置文件 指定类 properties

    2021年4月29日
  • spssk均值聚类报告_K均值聚类

    spssk均值聚类报告_K均值聚类机器学习中的k均值聚类属于无监督学习,所谓k指的是簇类的个数,也即均值向量的个数。算法初始状态下,要根据我们设定的k随机生成k个中心向量,随机生成中心向量的方法既可以随机从样本中抽取k个样本作为中心向量,也可以将中心向量固定在样本的维度范围之内,避免中心向量过偏远离大多数样本点。然后每个样本点需要与k个中心向量分别计算欧氏距离,取欧氏距离最小的中心向量作为该样本点的簇类中心,当第一轮迭代完成之后,…

    2022年10月28日
  • latex连乘符号怎么写_latex属于符号怎么打

    latex连乘符号怎么写_latex属于符号怎么打求和符号:\sum_{i=1}^{n}左侧的“\sum”代表求和符号,中间的"_{i=1}"代表下标是“i=1”,右边的"^{n}"代表上标是“n”。 连乘符号:\prod_{i=1}^{n}连乘除了最前面的词不一样,别的都和求和符号一样,下面再说求和符号其他形式。连乘都可以参考 求和符号不加上标\sum_{i=1}求和符号…

    2022年10月12日
  • Java和Python哪个更适合初学者的问题

    Java和Python哪个更适合初学者的问题我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。客观分析,这两种语言都在程序员的工具箱中都占有一席之地。学习哪个并不重要,个人觉得对于入门级同学来说,你要学的是“编程思想的基础知识“,而不是”特定的编程语言“。那这两门语言有区别吗?当然有,对于有一定编程经验的人来说…

    2022年7月7日
  • 常用#免费%代理IP库&整理*收藏——实时@更新(大概)

    常用#免费%代理IP库&整理*收藏——实时@更新(大概)常用免费代理IP库整理收藏——实时更新(大概)写在前面:仅整理交流分享,无任何商业用途,如有侵权请私信联系博主增删改查!!!如果还有其他好的免费代理网站,欢迎评论区留言交流,会实时更新到文章中;如有已经失效的也欢迎私信留言,博主会及时修改反馈!!!代理IP是什么代理IP,又称代理服务器,是网络信息的中转站,它是介于浏览器和Web服务器之间的一台服务器。Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。代理IP的类型代理类型大致分为.

    2022年9月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号