什么是.NET?什么是.NET Framework?

本文将从上往下,循序渐进的介绍一系列相干.NET的概念,先从类型零碎开始讲起,我将通过跨语言操作这个例子来逐步引入一系列.NET的相干概念,这次要包含:CLS、CTS(CLI)、FCL、Windows下CLR的相干外围组成、Windows下托管程序运行概念、什么是.NET Framework,.NET Core,.NET Standard及一些VS编译器相干杂项和相干浏览链接。残缺的从上读到下则你能够了解个大略的.NET体系。

但毕竟.NET零碎很宏大,本文篇幅无限,所以在局部大节中我会给出延长浏览的链接,在文章结尾我给出了一些小的倡议,心愿能对须要帮忙的人带来帮忙,最初就是求个三连,你们的反对是我更新的最大能源。

目录

  • .NET和C#是什么关系?
  • 跨语言和跨平台是什么?
  • 什么是跨语言互操作,什么是CLS?
  • CLS异样
  • 什么是CTS?

.NET和C#是什么关系

语言,是人们进行沟通表白的次要形式。编程语言,是人与机器沟通的表达方式。不同的编程语言,其侧重点不同。有的编程语言是为了科学计算而开发的,所以其语法和性能更偏差于函数式思维。有些则是为了开发应用程序而创建的,所以其语法和性能更为平衡全面。

微软公司是寰球最大的电脑软件提供商,为了占据开发者市场,进而在2002年推出了Visual Studio(简称VS,是微软提供给开发者的工具集) .NET 1.0版本的开发者平台。而为了吸引更多的开发者涌入平台,微软还在2002年发表推出一个个性弱小并且与.NET平台无缝集成的编程语言,即C# 1.0正式版。

所以只有是.NET反对的编程语言,开发者就能够通过.NET平台提供的工具服务和框架反对便捷的开发应用程序。

C#就是为宣传.NET而创建的,它间接集成于Visual Studio .NET中,VB也在.NET 1.0公布后对其进行反对, 所以这两门语言与.NET平台耦合度很高,并且.NET上的技术大多都是以C#编程语言为示例,所以常常就.NET和C#一概而论(本质上它们是相辅相成的两个概念)。
而作为一个开发者平台,它不仅仅是蕴含开发环境、技术框架、社区论坛、服务反对等,它还强调了平台的跨语言、跨平台编程的两个个性。

什么是跨语言和跨平台

跨语言:即只有是面向.NET平台的编程语言((C#、Visual Basic、C++/CLI、Eiffel、F#、IronPython、IronRuby、PowerBuilder、Visual COBOL 以及 Windows PowerShell)),用其中一种语言编写的类型能够无缝地用在另一种语言编写的应用程序中的互操作性。

跨平台:一次编译,不须要任何代码批改,应用程序就能够运行在任意有.NET框架实现的平台上,即代码不依赖于操作系统,也不依赖硬件环境。

什么是跨语言互操作,什么是CLS?

每门语言在最后被设计时都有其在性能和语法上的定位,让不同的人应用善于的语言去干适合的事,这在团队合作时尤为重要。

.NET平台上的跨语言是通过CLS这个概念来实现的,接下来我就以C#和VB来演示 什么是.NET中的跨语言互操作性。

艰深来说,尽管c#和vb是两个不同的语言,但此处c#写的类能够在vb中当做自家写的类一样失常应用。

比方我在vb中写了一个针对String的首字母大写的扩大办法,将其编译后的dll援用至C#我的项目中。

在C#我的项目中,能够像本身代码一样失常应用来自vb这个dll的扩大办法。

当初有那么多面向对象语言,但不是所有编程语言都能这样间接互操作应用,而.NET平台反对的C#和VB之所以能这样无缝连接,先读而后知,后文将会介绍原因。不过尽管.NET平台提供了这样一个互操作的个性,但究竟语言是不一样的,每个语言有其特色和差别处,在互相操作的时候就会不免遇到一些例外情况。

比方我在C#中定义了一个基类,类外面蕴含一个公开的指针类型的成员,我想在vb中继承这个类,并拜访这个公开的成员。

然而vb语言因为其定位不须要指针,所以并没有C#中如int*这样的指针类型,所以在vb中拜访一个该语言不反对的类型会报错的,会提醒:字段的类型不受反对。

再比方,C#语言中,对类名是辨别大小写的,我在C#中定义了两个类,一个叫BaseBusiness,另一个叫baseBusiness。我在vb中去继承这个BaseBusiness类。

如图,在vb中拜访这个类会报错的,报:"BaseBusiness"不明确,这是因为在vb中对类名是不辨别大小写的。在vb中,它认为它同时拜访了两个截然不同的类,所以依照vb的规定这是不合理的。那么为了在vb调用c#的程序集中防止这些因语言的差异性而导致的谬误,在编写c#代码的时候 就应该提前晓得vb中的这些规定,来应酬式的开发。

然而,如果我想不仅仅局限于C#和VB,我还想我编写的代码在.Net平台上通用的话,那么我还必须得晓得.NET平台反对的每一种语言和我编写代码所应用的语言的差别,从而在编写代码中防止这些。

这几年编程语言层出不穷,在未来.NET可能还会反对更多的语言,如果说对一个开发者而言把握所有语言的差别处这是不事实的,所以.NET专门为此参考每种语言并找出了语言间的共性,而后定义了一组规定,开发者都恪守这个规定来编码,那么代码就能被任意.NET平台反对的语言所通用。
而与其说是规定,不如说它是一组语言互操作的标准规范,它就是公共语言标准 - Common Language Specification ,简称CLS

CLS从类型、命名、事件、属性、数组等方面对语言进行了共性的定义及标准。这些货色被提交给欧洲计算机制作联合会ECMA,称为:共同语言基础设施。

就以类型而言,CLS定义了在C#语言中符合规范的类型和不合乎的有:

当然,就编码角度而言,咱们不是必须要看那些详略的文档。为了不便开发者开发,.NET提供了一个个性,名叫:CLSCompliantAttribute,代码被CLSCompliantAttribute标记后,如果你写的代码不合乎CLS标准的话,编译器就会给你一条正告。

值得一提的是,CLS规定只是面向那些公开可被其它程序集拜访的成员,如public、继承的protected,对于该程序集的外部成员如Private、internal则不会执行该检测规定。也就是说,所适应的CLS听从性规定,仅是那些公开的成员,而非公有实现。

那么有没有那种非凡状况,比方我通过反射技术来拜访该程序集中,以后语言并不领有的类型时会产生什么状况呢?

答案是能够尝试的,如用vb反射拜访c#中的char*指针类型,即便vb中没有char*这种等价的指针类型,但mscorlib提供了针对指针类型的 Pointer 包装类供其拜访,能够从运行时类携带的类型名称看到其本来的类型名。

能够看到,该类中的元素是不合乎CLS标准的。

CLS异样

提到非凡状况,还要说的一点就是异样解决。.NET框架组成中定义了异样类型零碎,在编译器角度,所有catch捕捉的异样都必须继承自System.Exception,如果你要调用一个 由不遵循此标准的语言 抛出其它类型的异样对象(C++容许抛出任何类型的异样,如C#调用C++代码,C++抛出一个string类型的异样),在C#2.0之前Catch(Exception)是捕获不了的,但之后的版本能够。
在后续版本中,微软提供了System.Runtime.CompilerServices.RuntimeWrappedException异样类,将那些不合乎CLS的蕴含Exception的对象封装起来。并且能够通过RuntimeCompatibilityAttribute个性来过滤这些异样。

RuntimeWrappedException

那么,这个段落总结一下,什么是CLS呢?

在面向.NET开发中,编写跨语言组件时所遵循的那些共性,那些标准就叫做 Common Langrage Specification简称 CLS,公共语言标准

官网CLS介绍

什么是CTS?

如果了解了什么是CLS的话,那么你将很轻松了解什么是CTS。
假如你曾经围绕着封装 继承 多态 这3个个性设计出了多款面向对象的语言,你发现大家都是面向对象,都能很好的将事实中的对象模型表达出来。除了语法和性能善于不同,语言的定义和设计构造其实都差不多一回事。

比方,事实中你看到了一辆小汽车,这辆车里坐着两个人,那么如何用这门语言来表白这样的一个概念和局面?
首先要为这门语言横向定义一个“类型”的概念。接下来在程序中就能够这样示意:有一个汽车类型,有一个人类型,在一个汽车类型的对象内蕴含着两个人类型的对象,因为要表白出这个模型,你又引入了“对象”的概念 。而当初,你又看到,汽车外面的人做出了开车的这样一个动作,由此你又引入了“动作指令”这样一个概念。
接着,你又豁然开朗总结出一个定理,无论是什么样的“类型”,都只会存在这样一个特色,即活着的 带生命特色的(如人) 和 死的 没有生命特色的(如汽车) 这两者中的一个。最初,随着思维模型的成熟,你发现,这个“类型”就相当于一个富裕主体特色的一组指令的汇合。
好,而后你开始照葫芦画瓢。你参考其它程序语言,你发现大家都是用class来示意类的含意,用struct示意构造的含意,用new来示意 新建一个对象的含意,于是,你对这部分性能的语法也应用class和new关键字来示意。而后你又发现,他们还用很多关键字来更丰盛的示意这些事实模型,比方override、virtual等。于是,在一直的思维降级和借鉴后,你对这个设计语言过程中思维的变动仔细分析,对这套语言体系给形象演绎,最终总结出一套体系。

于是你对其它人这样说,我总结出了一门语言很多必要的货色如两种次要类别:值类别和援用类别,五个次要类型:类、接口、委托、构造、枚举,我还规定了,一个类型能够蕴含字段、属性、办法、事件等成员,我还指定了每种类型的可见性规定和类型成员的拜访规定,等等等等,只有依照我这个体系来设计语言,设计进去的语言它可能领有很多不错的个性,比方跨语言,跨平台等,C#和VB.net之所以可能这样就是因为这两门语言的设计合乎我这个体系。

那么,什么是CTS呢?

当你须要设计面向.Net的语言时所须要遵循一个体系(.Net平台下的语言都反对的一个体系)这个体系就是CTS(Common Type System 公共类型零碎),它包含但不限于:

  • 建设用于跨语言执行的框架。
  • 提供面向对象的模型,反对在 .NET 实现上实现各种语言。
  • 定义解决类型时所有语言都必须恪守的一组规定(CLS)。
  • 提供蕴含利用程序开发中应用的根本基元数据类型(如 Boolean、Byte、Char 等)的库。

上文的CLS是CTS(Common Type System 公共类型零碎)这个体系中的子集。
一个编程语言,如果它可能反对CTS,那么咱们就称它为面向.NET平台的语言。

官网CTS介绍

微软曾经将CTS和.NET的一些其它组件,提交给ECMA以成为公开的规范,最初造成的规范称为CLI(Common Language Infrastructure)公共语言根底构造。
所以有的时候你见到的书籍或文章有的只提起CTS,有的只提起CLI,请不要奇怪,你能够宽泛的把他们了解成一个意思,CLI是微软将CTS等内容提交给国内组织计算机制作联合会ECMA的一个工业规范。