一文搞清到底什么是 .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?的更多相关文章
- Wiki版产品需求---产品需求文档到底是谁的?产品到底是谁的?
在听了测试的一通唠叨之后,"内部实现一堆逻辑,只有一句话的需求文档","文档那么简单,我们怎么测试啊",心中突然想起来自己曾经干的一件当时觉得还不错的事情,但是 ...
- Rancher监控指标一文干到底
一.工作负载指标 直接截取一个生产环境的rancher的web管理端-工作负载指标模块的图(这里没有汉化,直接英文)如下: 共5个大指标: CPU使用 内存使用 网络包 网络IO 磁盘IO 自学入口: ...
- Emacs阅读chm文档
.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...
- python接口自动化21-规范的API接口文档示例
前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...
- Mac OS X 背后的故事
Mac OS X 背后的故事 作者: 王越 来源: <程序员> 发布时间: 2013-01-22 10:55 阅读: 25840 次 推荐: 49 原文链接 [收藏] ...
- Android学习笔记之DocumentBuilder的使用....
PS:当你的才华还撑不起你的野心时,那你需要静下心来学习..... 学习内容: 1.从服务器上获取XML文档... 2.解析XML文档中的内容... XML文件想必大家都非常的熟悉,可扩展的标记语 ...
- Monogb基本概念及基本操作
MongoDB是面向文档的数据库. 索引:MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的.复合的和地理空间索引能力. 存储JavaScript:开发人员不必使用存储过程了,可以直接在 ...
- 对敏捷开发的误解(转自MBAlib)
对敏捷开发的误解 误解一:敏捷对人的要求很高 很多人在尝试实施敏捷时说:敏捷对人的要求太高了,我们没有这样的条件,我们没有这样的人,因此我们没法敏捷.可是,敏捷对人的要求真的那么高么? 软件归根到底还 ...
- [ES]elasticsearch章5 ES的分词(一)
初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景: 1.为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢? 2.我存进去的文档到底被分成哪些词(ter ...
随机推荐
- 看书记笔记 书名21天学C#
☆:为重点★:为科普△:注▲:术语 前言概述 ☆一门语言必须包括诸如异常处理,无用单元收集,可扩展数据类型以及代码安全性等特征☆C#特性:简单性,面向对象,模块性,灵活性,简明性 ☆C#面向对象的封装 ...
- angular6实现对象转换数组对象
1 使用表单获取到数据以后,是对象类型的数据如下图 而后台需要返回的数据是这种key:value的形式传入 2 废话不多说直接上代码(代码只截取部分,仅供参考跑不起来,最后又一个小demo可以运行 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- vue-cli 3.0生成的项目run build后为空白页
vue-cli 3.0 生成的项目与2.x不同,其中并没有webpack配置文件config/index.js.这个时候需要我们在项目的根目录下创建一个vue.config.js文件,代码如下: mo ...
- 二.Flask 学习模板
Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于模板渲染? 简单来说,就是将 ...
- python基础——2、python应用(随机、异常)——(YZ)
本次的内容为python的应用,关于随机.异常的应用,均多应用列表. 习题一 1.初始化一个数据集,包括5-10位同学的成绩数据(数据类型不限),数据格式如下: 学号 姓名 Java C语言 Pyth ...
- 常用的几个CSS前端效果
做页面需要一定的CSS基本功,虽然现在有很多成熟的框架如bootstrap等,我们轻松的就就可以做出一些页面效果.但是掌握每一个常见效果的写法还是很重要的,下面整理出一些常见的CSS前端效果,让你更轻 ...
- 古墓丽影:崛起 PC版今日发售
之前xbox one的独占游戏 古墓丽影: 崛起(Rise of the Tomb Raider™), 今天正式在steam发售了, 之前就可以预购.简单看了一下, 画风跟前代类似, 但是画面更好, ...
- 火狐firebug和firepath插件安装方法(最新)
火狐浏览器最近下掉了firebug和firepath插件,用户即使下载了火狐55以下的版本,也无法查找到这两个插件. 因此,可以用以下方法来获取这两个插件. 1.下载火狐55以内版本安装包,安装时迅速 ...
- 使用multidex解决64K方法引用的限制
1.什么是64K方法引用的限制 65536(64K)是单个dex(Dalvik Executable)字节码文件的可引用的方法数的最大数,包括Android framework.应用的library和 ...