CS5L1——.NET相关知识

  1. 微软的.NET是什么

    是一个包含编程语言、框架、IDE等产品的系列产品统称

  2. .NET 跨语言的实现

    CLI 公共语言基础结构(CTS 公共类型系统)
    CLS 公共语言规范是它的子级

  3. .NET 跨平台的实现
    基于 .NET Framework 的 Mono 和 .NET Core
    都基于 CLI 公共语言基础结构和 CLR 公共语言运行时实现跨语言和跨平台

image

.NET

微软的 .NET 既不是编程语言也不是框架,是类似于 互联网时代、次时代、21世纪、信息时代 之类的宣传口号
它是一整套技术体系的统称,或者说它是微软提供的技术平台的代号
包含的内容有:

  • 框架体系:.NET Framework、.NET Core、Mono 等等
  • 开发语言:C#、VB、F等等(C#是.Net平台主推的开发语言)
  • 开发工具:Visual Studio、Visual Studio Code 等等

你可以简单理解 .NET 本质上就是微软为自己的一系列产品取的一个代号

微软做.NET平台的目的

  1. 跨语言

    只要是面向.NET平台的编程语言(C#、VB、C++、F#等等),
    用其中一种语言编写的内容可以无缝地用在另一种语言编写的应用程序中

  2. 跨平台

    一次编译,不需要任何代码修改,应用程序就可以运行在任意有.NET框架实现的操作系统上,
    即代码不依赖于操作系统,也不依赖硬件环境

.NET跨语言的实现

  1. 公共语言规范 CLS(Common Language Specification)

    .NET专门参考每种语言并找出了语言间的共性,定义了一组规则。
    与其说是规则,不如说它是一组语言互操作的标准规范
    只要开发者都遵守这个规则来编码,那么代码就能被任意.NET平台支持的语言所通用,
    即可以通过不同的编程语言(C#、VB、J#等等)来创建应用程序。

  2. 公共类型系统 CTS(Common Type System)

    当你需要设计面向 .NET 的语言时需要遵循一个体系,这个体系就是 CTS
    刚才提到的 CLS 公共语言规范 就是 CTS 公共类型系统的子级
    一个编程语言,如果它能够支持 CTS,那么我们就称它为面向 .NET 平台的语言

  3. 公共语言基础结构 CLI(Common Language Infrastructure)

    是微软将 CTS 等内容提交给国际组织计算机制造联合会 ECMA 的一个工业标准

总结:
微软为了实现跨语言,制定了一些规范,只要一门语言支持CTS(公共类型系统)的规则,那么我们就能够使用它在.NET平台下开发应用程序
CLS(公共语言规范)是 CTS 的一个子级,是一组语言互操作的标准规范
我们经常可以看到的 CLI (公共语言基础结构),它包含CTS(公共类型系统)
它是微软将 CTS 等内容提交给国际组织计算机制造联合会ECMA的一个工业标准

.NET跨平台的实现

通过上面对跨语言的讲解,大家很容易发现:
.NET的跨语言是让各种语言支持 .NET 的规范 CLI(也就是CTS等规范)
早期的.NET系列产品主要是为了给Windows操作系统服务的,并没有跨平台的特性,
即使跨语言了,也只是可以使用多语言开发Windows上的应用程序

那么这里就不得不提几个概念 .NET Framework.NET CoreMono 我们先来认识下他们

.NET Framework

在2002年推出1.0版本
.NET Framework 是一个可以快速开发、部署网站服务及应用程序的开发框架,是 Windows 中的一个组件,部分开源,
主要用于开发Windows下应用程序,包括:

  • 公共语言运行时(Common Language Runtime, CLR)
  • 虚拟执行系统
  • .NET Framework 类库等

.NET Framework的体系结构

image

制作应用程序:

编程语言 + 调用各种类库,进行开发,然后生成程序集

  1. 只要支持 CLS 公共语言规范的语言都可以用于 开发 Windows 下的各种应用程序和网站程序
  2. BCL(基础类库)和 FCL(框架类库)是这个框架体系中为我们实现好的各种API
  3. 程序集的表现就是后缀为 .dll 或者 .exe 格式的文件

其中包含的最关键信息:

  • PE头、CLR 头(就是一些程序的格式信息,比如入口方法,版本号等等)
  • CIL 代码(通用中间代码)
    是介于源代码和机器码之间的代码,之后会通过 CLR 产生机器码
    CIL 代码你可以理解为由于可能使用不同的代码进行开发,所以会将这些代码翻译为统一规范的中间代码

CLR —— 让应用程序在操作系统上运行

公共语言运行时 CLR(Common Language Runtime),它是.NET Framework的基础,所有的.NET技术都是建立在此之上的
它是一个在执行时管理代码的代码,提供内存管理、线程管理等等核心服务,就好像一个小型的操作系统一样,所以形象的把它称为“.NET虚拟机”
如果想要应用程序在目标操作系统上能够运行,就必须依靠.NET提供的CLR环境来支持,那就必须在操作系统上安装.NET Framework
它会把程序集中的IL(中间代码)翻译成机器码最终在操作系统上运行。

CLR主要做的事情

image

总结

.NET Framework 是一个主要用于跨语言开发,Windows 操作系统下的应用程序的框架结构,他并不支持跨平台

.NET Core

.NET Core 是 2016 年推出的 .NET Framework 的新一代版本
它就像是 .NET Framework 的兄弟,
是 .NET Framework 的翻版实现,它是一个开源项目
它是基于 .NET Framework 来进行设计的,主要目的就是跨平台
是 .NET 技术框架组成在 Windows、MacOS、类 Linux 系统下的具体实现
原理就是为不同的操作系统实现对应的 CLR 公共语言运行时(.NET虚拟机)
这样就能在不同的平台上将IL(中间代码)翻译成机器码在操作系统上运行了

image

Mono

从前面 .NET FrameWork 和 .NET Core 相关内容我们了解到:
从并不跨平台的 .NET FrameWork 在 2002 年正式问世,到 2016 年跨平台的 .NET Core 的诞生,中间 .NET 平台有 14 年的并不跨平台的空窗期
而在这段时间内,难道 .NET 就并不支持跨平台了吗?答案当然是否定的,那么我们就不得不提 Mono 了

Mono 是一个由 Xamarin 公司(已被微软收购)所赞助的开源项目,它基于 .NET 的 CLI(Common Language Infrastructure)公共语言基础结构
提供了微软 .NET FrameWork 的另一种实现,它相对 .NET FrameWork 最大的区别就是具备跨平台的能力
它不仅可以运行在 Windows、MacOS、Linux 等操作系统,甚至还可以运行在 PS3、XBOX、Wii 等主机平台上
Mono 的 1.0 版本出现在2004年,也就是说在 .NET Core 出现之前,Mono 是 .NET 平台实现跨平台的不二之选

Mono如何实现跨平台

Mono 利用 .NET 平台制定的 CLI 公共语言基础结构规则, 利用它我们可以把很多种语言编译成通用规范的 CIL 公共中间语言
利用 CLR 公共语言运行时,将这些 CIL 公共中间语言转换为操作系统的原生代码(主要做的就是在各种操作系统上实现了对应的CLR内容)
这样用各种不同语言编写的逻辑就能够在指定操作系统上运行了,它的这一套规则是在 .NET Framework 规则上进行的修改和添加

跨平台的实现总结:

  • .NET Framework(2002年发布):部分开源,主要用于开发 Windows 平台下应用,包含 Windows 平台的所有特性
  • .NET Core(2016年发布):完全开源,可以针对多个平台开发应用,包含 .NET Framework 部分特性
  • Mono(2004年发布):完全开源,早期乃至现在也是.NET的跨平台解决方案

总体而言,在 .NET Core 出现之前开发者都通过 Mono 来实现.NET的跨平台
我们可以使用基于 .NET 平台的 Mono 开发,便可以发布可以在主流的各种操作系统上运行的应用程序