.NET

有的直接称.NET,有的称.NET Framework。那么准确来说什么是.NET?什么又是.NET Framework呢?

.NET是一个微软搭造的开发者平台,它主要包括:

  1. 支持(面向)该平台的编程语言(如C#、Visual Basic、C++/CLI、F#、IronPython、IronRuby…),
  2. 用于该平台下开发人员的技术框架体系(.NET Framework、.NET Core、Mono、UWP等),
    1. 定义了通用类型系统,庞大的CTS体系
    2. 用于支撑.NET下的语言运行时的环境:CLR
    3. NET体系技术的框架库FCL
  3. 用于支持开发人员开发的软件工具(即SDK,如VS2017、VS Code等)

.NET Framework

事实上,像诸如程序集、GC、AppDomain这样的为CLR的一些概念组成,实质上指的是.NET Framework CLR

.NET平台是微软为了占据开发市场而成立的,不是无利益驱动的纯技术平台的那种东西。基于该平台下的技术框架也因为 商业间的利益 从而和微软自身的Windows操作系统所绑定。所以虽然平台雄心和口号很大,但很多框架类库技术都是以Windows系统为蓝本,这样就导致,虽然.NET各方面都挺好,但是用.NET就必须用微软的东西,直接形成了技术-商业的绑定。

.NET Framework就是.NET技术框架组成在Windows系统下的具体的实现,和Windows系统高度耦合,上文介绍的.NET系统,就是指.NET Framework

部署.NET Framework
.NET Framework高级开发
.NET Framework源码在线浏览

.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框架实现的平台上,即代码不依赖于操作系统,也不依赖硬件环境。

.NET技术栈的分析

.NET从第一版发布至今,也有17年历史了。能经久不衰,肯定有它的特长和亮点。我认为它最大的亮点就是生产力。最大的特长是做桌面应用。

说通俗点,就是.NET什么都能做,做桌面他最精,出活他最快。

做移动端,.NET也有一席之地,xamarin和Unity。然而竞争对手有JAVA和Obj-C,Swift,H5与之PK。xamarin还嫩了点。

做后台服务,.NET Core,WCF这些技术不错,但服务器很多是Linux,JAVA先入为主,更有优势。

做网页,ASP.NET很好。但是竞争对手就更多更强了,JAVA,PHP,js,各种开源解决方案。

在现在流行的NO SQL、AI这些领域,.NET也有一席之地,然而这块它显然不是主流。

而在桌面这块,有WPF,Winform,和他相关的有WCF,WF,ADO.NET,EF,LINQ。结合Visual Studio,Office,SQL Server,竞争对手完全不是一个档次。

那么,这个技术栈最适合的领域是哪些呢,我认为就是运行在Windows系统上的各种程序。

桌面应用要数据库有数据库,要服务有服务,要控件有控件,要报表有报表(RDLC),简直是要啥有啥。更不用说还有强大的第三方控件、丰富的开源组件。

如果有人想用JAVA或者其他什么技术做桌面,我只能说,这很奇葩。除非你对性能要求到苛刻程度。

如果你想做移动端,大数据,互联网什么的,继续用.NET没问题。但是性价比不突出。比如NO SQL这块的,其他语言擅长就让它做好了,.NET来调用就是。田忌赛马,扬长避短。

有人说桌面药丸,微软要倒,What?微软新CEO上台两年股票涨了一倍多,现在活得好好的,DELPHI这个没妈的孩子现在都在茁壮成长,是不是想多了。

又有人拿.NET的性能说事。说什么不如C++云云。这个之前的老赵、xiaotie他们都分析过,按我经验,还没发现有什么性能问题。

因为.NET类库和C#语言都有一个特点,就是给你多种选择。你想省事偷懒自然可以用现成的。想追求极致,甚至你可以用指针。我也用过指针。

差不了多少的性能,和天壤之别的开发效率,这个性价比应该仔细考量。

.NET Core

有丑才有美,有低才有高,概念是比较中诞生的。.NET Core就是如此,它是其它操作系统的.NET Framework翻版实现。

操作系统不止Windows,还有Mac和类Linux等系统, .NET的实现 如果按操作系统来横向分割的话,可以分为 Windows系统下的 .NET Framework和 兼容多个操作系统的.NET Core

我们知道,一个.NET程序运行核心在于.NET CLR,为了能让.NET程序在其它平台上运行,一些非官方社区和组织为此开发了在其它平台下的.NET实现(最为代表的是mono,其团队后来又被微软给合并了 ),但因为不是官方,所以在一些方面多少有些缺陷(如FCL),后来微软官方推出了.NET Core,其开源在Github中,并被收录在NET基金会(.NET Foundation,由微软公司成立与赞助的独立自由软件组织,其目前收录包括.NET编译器平台(“Roslyn”)以及ASP.NET项目系列,.NET Core,Xamarin Forms以及其它流行的.NET开源框架),旨在真正的 .NET跨平台。

.NET Core.NET技术框架组成在Windows.macOS.Linux系统下的具体的实现。
.NET Core是一个开源的项目,其由 Microsoft 和 GitHub 上的 .NET 社区共同维护,但 这份工作仍然是巨大的,因为在早期对.NET上的定义及最初的实现一直是以Windows系统为参照及载体,一些.NET机制实际上与Windows系统耦合度非常高,有些属于.NET自己体系内的概念,有些则属于Windows系统api的封装。 那么从Windows转到其它平台上,不仅要实现相应的CLR,还要舍弃或重写一部分BCL,因而,.NET Core在概念和在项目中的行为与我们平常有些不同。

比如,NET Core不支持AppDomains、远程处理、代码访问安全性 (CAS) 和安全透明度,任何有关该概念的库代码都应该被替换。
这部分代码它不仅指你项目中的代码,还指你项目中using的那些程序集代码,所以你会在github上看到很多开源项目都在跟进对.NET Core的支持,并且很多开发者也尝试学习.NET Core,这也是一种趋势。

.NET Core指南
.NET基金会
.NET Core跨平台的行为变更
微软宣布.NET开发环境将开源

.NET Standard

值得一提的是微软还为BCL提出了一个标准,毕竟各式各样的平台,技术层出不穷,为了防止.NET在类库方面的碎片化,即提出了一套正式的 .NET API (.NET 的应用程序编程接口)规范,.NET Standard。

正如上面CLS一样,.NET Standard就类似于这样的一个概念,无论是哪个托管框架,我们遵循这个标准,就能始终保持在BCL的统一性,即我不需要关心我是用的.NET Framework还是.NET Core,只要该类被定义于.NET Standard中,我就一定能在对应支持的.NET Standard的版本的托管框架中找到它。

.NET Standard

.NET Standard开源代码

CLS

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

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的一个工业标准。

CLR,.NET虚拟机

实际上,.NET不仅提供了自动内存管理的支持,他还提供了一些列的如类型安全、应用程序域、异常机制等支持,这些 都被统称为CLR公共语言运行库

CLR是.NET类型系统的基础,所有的.NET技术都是建立在此之上,熟悉它可以帮助我们更好的理解框架组件的核心、原理。

在我们执行托管代码之前,总会先运行这些运行库代码,通过运行库的代码调用,从而构成了一个用来支持托管程序的运行环境,进而完成诸如不需要开发人员手动管理内存,一套代码即可在各大平台跑的这样的操作。

这套环境及体系之完善,以至于就像一个小型的系统一样,所以通常形象的称CLR为".NET虚拟机"。那么,如果以进程为最低端,进程的上面就是.NET虚拟机(CLR),而虚拟机的上面才是我们的托管代码。换句话说,托管程序实际上是寄宿于.NET虚拟机中。

类库

在CTS中有一条就是要求基元数据类型的类库。我们先搞清什么是类库?类库就是类的逻辑集合,你开发工作中你用过或自己编写过很多工具类,比如搞Web的经常要用到的 JsonHelper、XmlHelper、HttpHelper等等,这些类通常都会在命名为Tool、Utility等这样的项目中。 像这些类的集合我们可以在逻辑上称之为 “类库”,比如这些Helper我们统称为工具类库。

基础类库BCL

当你通过VS创建一个项目后,你这个项目就已经引用好了通过.NET下的语言编写好的一些类库。比如控制台中你直接就可以用ConSole类来输出信息,或者using System.IO即可通过File类对文件进行读取或写入操作,这些类都是微软帮你写好的,不用你自己去编写,它帮你编写了一个面向.NET的开发语言中使用的基本的功能,这部分类,我们称之为BCL(Base Class Library) 基础类库,它们大多都包含在System命名空间下。

基础类库BCL包含:基本数据类型,文件操作,集合,自定义属性,格式设置,安全属性,I/O流,字符串操作,事件日志等的类型

框架类库FCL

有关BCL的就不在此一一类举。.NET之大,发展至今,由微软帮助开发人员编写的类库越来越多,这让我们开发人员开发更加容易。由微软开发的类库统称为:FCL,Framework Class Library ,.NET框架类库,我上述所表达的BCL就是FCL中的一个基础部分,FCL中大部分类都是通过C#来编写的。

在FCL中,除了最基础的那部分BCL之外,还包含我们常见的 如 : 用于网站开发技术的ASP.NET类库,该子类包含webform/webpage/mvc,用于桌面开发的 WPF类库WinForm类库,用于通信交互的WCFasp.net web apiWeb Service类库等等

.NET程序执行图

在这里插入图片描述

.NET官方开源项目链接

现在我将给出.NET相关的开源项目地址:
参与.NET和.NET开源项目的起点

.NET Core:https://github.com/dotnet/core
.NET Core文档:https://github.com/dotnet/docs
ASP.NET Core:https://github.com/aspnet/home
ASP.NET Core文档:https://github.com/aspnet/Docs
EntityFramework Core框架:https://github.com/aspnet/EntityFrameworkCore
ASP.NET Core MVC框架:https://github.com/aspnet/Mvc
EntityFramework6:https://github.com/aspnet/EntityFramework6
.NET Framework源码:https://github.com/microsoft/referencesource
.NET Core基类库:https://github.com/dotnet/corefx
.NET Core CLR:https://github.com/dotnet/coreclr
Roslyn编译器:https://github.com/dotnet/roslyn
MVC5、Web API2、Web Pages3框架源码:https://github.com/aspnet/AspNetWebStack
.NET Standard:https://github.com/dotnet/standard
KestrelHttpServer用于ASP.NET Core的跨平台Web服务器:https://github.com/aspnet/KestrelHttpServer
Visual Studio Code源码:https://github.com/Microsoft/vscode
一些优秀的.NET库、工具、框架、软件开源集合:https://github.com/quozd/awesome-dotnet
一些常用框架对ASP.NET Core和.NET Core的支持报告:https://github.com/jpsingleton/ANCLAFS
一些.NET下用于支持开发的开源项目集合:https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md
微软出品的分布式框架orleans:https://github.com/dotnet/orleans
ML.NET 用于.NET的开源和跨平台机器学习框架:https://github.com/dotnet/machinelearning

详细请参考原文:https://www.cnblogs.com/1996V/p/9037603.html#net5-1

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐