C#学习记录——.NET Framework的组成及C#程序的执行过程
『好好学习,天天向上。』—— 毛主席语录
.NET Framework的组成
.NET Framework 是由微软公司推出的一种完全面向对象的软件开发平台,它主要由两个组件构成,分别为公共语言运行库(CLR)和.NET Framework类库,如下图:
公共语言运行库是.NET Framework 的基础。用户可以将运行库看做一个执行时的管理环境,它提供内存管理、线程管理和远程处理等核心服务。通常在CLR中运行的代码称为托管代码(Managed Code),它主要有两个作用:
(1)与操作系统进行交互,让用户的程序可以在操作系统里执行响应。
(2)统一数据类型和统一语言语法,原因是.NET框架上有不止C#一种语言,其中还包括VC++,VC.NET等,这些语言编写的程序其实最后都会在公共语言运行库这边翻译成统一的语言(这就是中间语言IL),然后与操作系统进行相关的交互。
.NET Framework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,用户可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI)应用程序,也包括基于ASP.NET所提供的最新创新的应用程序,如Web Forms、XML和Web Services等。
C#和.NET Framework
每一种编程语言,要想执行,就必须要转换为目标操作系统能够理解的语言才能执行,这种语言叫做本机代码。C#也是一样的,也要做这样的转换,但是它不是一步到位的,在.NET Framework这个平台下,该过程分为一下两个阶段。
1、编译
在编译C#代码时,并不是立即创建本地代码,而是通过C#编译器把代码编译为通用中间语言(Common Intermediate Language,CIL)代码,也就是IL代码,并将其存储在一个程序集中。
注意:在C#中,程序集分为两种,扩展名为.exe的可执行文件和扩展名为.dll的可供其他程序调用的库文件。
2、执行
执行C#程序时,程序集将加载到CLR中。要使代码能够在目标操作系统上运行,还需要进一步把CIL代码转换为特定CPU的本机代码,该过程是由即时编译器(Just In Time,JIT)来完成的。CLR还提供与自动垃圾回收、异常处理和资源管理有关的其他服务。由CLR执行的代码有时称为“托管代码”,与之相对应的是编译为面向特定系统的本机机器语言的“非托管代码”。
关于C#源代码的编译与执行如下图:
在JIT编译生成本机代码之后,编译好的本机代码会被存储在一个缓冲区中缓存,下次调用相同的程序集时,可直接从缓冲区中获取本机代码,从而避免了二次验证和编译。这样的使用方式,系统只在首次调用时才会造成一些性能损失(JIT编译过程),所以C#程序在第一次调用的时候,会明显感觉慢一些。
相关文章
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
- Starting with Keras.NET in C# - Train Your First Model
- 10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#)
- ASP.NET Razor - C# Variables
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
- MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
- .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片
- 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 [WPF]为旧版本的应用添加触控支持 js css等静态文件版本控制,一处配置多处更新.net版【原创】 C#图片处理,缩略图制作 SqlDataReader 结果集 转成 DataTable DataTable转成List集合 如何使用linq读取DataTable集合?
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
- Word控件Spire.Doc 【文本】教程(2) ;在 C#、VB.NET 中从 Word 文档中提取文本
- Word控件Spire.Doc 【图像形状】教程(1) ;如何在 Word 中插入图像(C#/VB.NET)
- Word控件Spire.Doc 【文档操作】教程(七):在 C#、VB.NET 中从 URL 下载 Word 文档
- C# asp.net实现百度站长工具的主动推送功能
- asp.net的aspx文件里的page指令属性_c#的page指令_.net的page指令_aspx的page指令
- 有关C# 8.0、.NET Framework 4.8与NET Standard 2.1的一个说明
- .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)——转载
- C#/Asp.Net 获取各种Url的方法
- [.NET]c#.net程序中使用ffmpeg.exe来处理视频并生成上传视频的截图