最近想系统性的学习下.net core ,在这之前我想再重新的认识下.net ,以及跟.net core 的区别。
有些我们开发.net经常用到的词汇可能还不是很了解,或者不能清晰的出他们的关系与却别,所以重新汇总了一下:
.net :
NET 是 Microsoft 的用以创建 XML Web 服务(下一代软件)平台,该平台将信息、设备和人以一种统一的、个性化的方式联系起来。借助于 .NET 平台,可以创建和使用基于 XML 的应用程序、进程和 Web 站点以及服务,它们之间可以按设计、在任何平台或智能设备上共享和组合信息与功能,以向单位和个人提供定制好的解决方案。简单的说,一个.NET应用是基于.NET Framework类库来编写,并运行于公共语言运行时 Common Language Runtime之上的应用程序。
CLR:
Commen Language Runtime ,是一种多语言执行环境,支持众多的数据类型和语言特性,跟java虚拟机一样,是支持程序运行时的环境,它管理着代码的执行,负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。
CLI:
通用语言基础结构(Common Language Infrastructure,CLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL(微软中间语言)代码的应用程序的运行环境进行管理的那一部分。CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为 MSIL代码之后运行其上。
IL/CIL:
Intermediate Language或者Common Intermediate Language,常被称作微软中间语言MSIL或通用中间语言CIL。(高级语言 => IL=>汇编(机器码)) .NET平台上的各种高级语言(如C#,VB,F#)的编译器会将各自的代码转化为IL-人类可读的最低阶的语言。JIT会把IL根据不同的CPU架构(如x86/IA64等等)生成不同的机器码。这也是 Java/.NET中“Compile Once,Run Everywhere”这一口号的技术基础:它们为不同的CPU架构提供了不同的“IL转化器”。
JIT:
JIT(Just In Time简称JIT)是.Net边运行边编译的一种机制。
从微软推出的第一个版本.net 1.0开始到现在.net4.6,可以列为下面这个表(引用零点编程的汇总)
C#版本 |
.NET Framework版本 |
CLR版本 |
VisualStudio版本 |
C#1.0 |
.NET Framework 1.0 |
CLR1.0 |
Visual Studio 2002 |
C#1.2 |
.NET Framework 1.1 |
CLR1.1 |
Visual Studio 2003 |
C#2.0 |
.NET Framework 2.0 |
CLR2.0 |
Visual Studio 2005 |
C#3.0 |
.NET Framework 2.0 .NET Framework 3.0 .NET Framework 3.5 |
CLR2.0 |
Visual Studio 2008 Visual Studio 2010 |
C#4.0 |
.NET Framework 4.0 |
CLR4.0 |
Visual Studio 2010 |
C#5.0 |
.NET Framework 4.5 |
CLR4.0 |
Visual Studio 2012 Visual Studio 2013 |
C#6.0 |
.NET Framework 4.6 |
CLR4.0 |
Visual Studio 2015 |
net-framework-1.0
该版本是微软第一个.net framework版本,可独立安装,该版本主要包括公共语言运行库CLR1.0和、BCL类库和ASP.NET开发框架。
net-framework-1.1
增强了可伸缩性和性能,支持ASP.NET开发移动设备的应用程序、支持IPV6网络、ADO.NET、支持Oracle数据库进行本机通信。有了它,我们还能够使用代码访问安全性来进一步锁定和隔离ASP.NET应用程序,net-framework-1.1不是net-framework-1.0的升级版,而是一个独立的全新版本,全新的CLR1.1运行时,您可以在机器上同时安装net-framework-1.0和net-framework-1.1,两者互不影响。
net-framework-2.0
全新的改进,独立与之前的任何一个版本,独立安装,支持64位平台,运行库使用CLR2.0版本,新增泛型(Generic)、全新的API、多线程、内存分配、程序集动态加载、部分类(Partial关键字)、可空类型(Nullable)、匿名方法(Anonymous Method)、迭代器(Iterator)、DataTable和静态类(Static Class),对ADO.NET和ASP.NET框架的增强,在ASP.NET中支持主题、web部件、和Membership权限认证。
net-framework-2.0-sp1
net-framework-2.0-sp1是一个累计更新包,在net-framework-2.0发布后,客户报告了一些问题,针对这些问题,提供此更新,该更新还可帮助改进安全性,同时提供了net-framework-3.0-sp1和net-framework-3.5的系统必备功能支持,net-framework-2.0-sp1必须在net-framework-2.0的基础上进行安装。
net-framework-2.0-sp2
net-framework-2.0-sp2是一个累计更新包,在net-framework-2.0发布后,客户报告了一些问题,针对这些问题,提供此更新,同时提供了对net-framework-3.5-sp1的必备功能支持。
net-framework-3.0
独立安装包,安装包中已包含net-framework-2.0和net-framework-2.0-sp1,在这个版本中运行库仍然使用CLR2.0版本,基于net-framework-2.0的基础上新增WPF(Windows Presentation Foundation)、WCF(WindowsCommunication Foundation)、WF(Workflow Foundation)和CardSpace框架。
net-framework-3.0-sp1
针对net-framework-3.0发布后客户报告的问题提供了累积的汇总更新,该更新还可帮助改进安全性,同时提供了用于net-framework-3.5的必备功能支持。
net-framework-3.0-sp2
该更新用于解决在net-framework-3.5-sp1和net-framework-4.0混合环境中,在序列化和反序列化时,使用BinaryFormatter或NetDataContractSerializer不兼容问题,安装此更新可以解决这些问题。
net-framework-3.5
独立安装包,安装包已包含net-framework-3.0和net-framework-3.0-sp1,语言中新增LINQ、AJAX、局部var关键字、自动属性(直接写get和set)、匿名类型、对象与集合初始化器、扩展方法和Lambda表达式,新增
ADO.NET Entity Framework数据访问框架,添加两个新的程序集System.Web.Abstraction.dll和System.Web.Routing.dll。
net-framework-3.5-sp1
看似累计更新,实际上这个可以独立安装,它包含基于net-framework-2.0、3.0和3.5不断生成的新功能,此外还包括net-framework-2.0和net-framework-3.0子组件的累积更新。
net-framework-4.0
新的CLR4.0版本、任务并行库用于并行计算、PLINQ、方法的参数支持命名和可选参数、代码约定(Contracts)、动态语言运行时(DLR)、动态类型(dynamic)、集成托管扩展性框架 (MEF)和新增BigInteger和Complex类型。
net-framework-4.5
支持Metro风格的应用程序开发、可移植类库(Portable Class Libraries)、后台垃圾回收机制(BackgroundGC)、后台及时编译器(Background JIT)、异步方法、WebSocket、支持基于HTML5的ASP.NET应用程序开发、引入async和await关键字。
CLR表示公共语言运行时、BCL表示基础类库、FCL表示框架类库:
net-framework-1.0 = CLR1.0 + BCL
net-framework-1.1 = CLR1.1 + BCL
net-framework-2.0 = CLR2.0 + BCL+ FCL(WinForm + WebForm)
net-framework-3.0 = net-framework-2.0 + FCL(WCF + WPF + WF + WCS)
net-framework-3.5 = net-framework-3.0 + BCL(AJAX + Silverlight + LINQ + EF)
net-framework-4.0 = CLR4.0 + BCL(PLINQ + TaskParallel + DLR + BackgroundGC)
net-framework-4.5 = net-framework-4.0 + BCL(Metro + Async + BackgroundJIT + WebSockets)
.net core
我们知道,.net程序想要在window上运行,他需要依赖window系统下的clr.dll等环境和类库,但是其他平台没有就运行不起来。先不说其他第三方组织做了其他平台.net实现,光是net-framework过于庞大而杂,有些库效率不如其他第三方库等就让人接受不了。在跨平台方面,虽然有mono(被微软收购)等第三方组织做了实现,但是还是很多缺陷。为此,微软正式推出.net core 旨在真正实现跨平台。
为了.net 平台的规范,防止.net类库方面的碎片化,微软.net 6.0开始推出了.net Standard(标准),基于这个标准,不管你用的是.NET Framework还是.NET Core只要该类被定义于.NET Standard中,我就一定能在对应支持的.NET Standard的版本的托管框架中找到它。
.net core 的安装
下载链接:https://dotnet.microsoft.com/download
下载最新的sdk,安装。如果想要验证你安装的有没成功,可以打开CMD领料窗口输入:dotnet -v 就会查看到.net的版本信息。
安装完成之后我们会在C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\2.2.0下面看到你安装的版本目录(我装的是2.2.0),跟net-framewor一样,有一个coreclr.dll的运行库。
这个目录下面我们也可以看到很多库都拆分成小的dll,使用起来也更加轻巧,不会有因为使用一个小的方法而把所有的库引用进来。但是这个也会造成很多开发者不熟悉库,找不到需要的dll,或者需要引入很多dll才能实现自己想要的。所以微软有一个包和元包的概念,下面解释。
我们用命令行创建一个控制台程序,输入dotnet new console -n myapp
桌面生成一个myapp的项目文件夹,命令行进入该目录,执行 dotnet run 可以直接编译运行该程序,其他一些命令可以通过dotnet -h查看
我们看到目录中的项目文件是.csproj格式的,使用visual studio 打开。
目录结构依赖项中有个SDK,下面Microsoft.NETCore.App下有很多引用包,这个Microsoft.NETCore.App就是一个元包,他下面的就是包,元包可以管理多个包。元包是将某一类的包打包成一个元包,在开发的时候直接引用元包,省去逐个引用的麻烦。
Microsoft.NETCore.App也是一个nuget的包,我们打开nuget包管理,安装Newtonsoft.Json包,如图。
我们看到安装之后没有package.config这个配置文件了,其实包的安装配置整合在csproj项目文件里了。右键编辑项目文件可以看到,nuget包Newtonsoft.Json已经配置在节点ItemGroup下面了。
这一章先大致了解下.net core一些表面的东西,后面慢慢写.net core更深层次的内容。