底层运行机制CLR-C#

CLR的执行模型(C#)

流程:

1.将源代码编译成委托代码——>2.将委托代码合并成程序集——>3.执行程序集代码——>4.加载公共语言进行时

注:CLR(Common Language公共语言)CLR是一个可由多种编程语言使用的“运行时”。CLR的核心功能(e.g.内存管理、程序集加载、安全性、异常处理、线程同步等),可由面向CLR的所有语言使用。

1、将源代码编译成委托模块:

CLR根本不关心开发人员用那一种语言来写源代码,说明我我们写C#代码的时候肯定还经过一定的步骤才能跟CLR,于是就需要相应的面向CLR的、可以编译C#代码的编译器,以便CLR可以识别你写的东西。这个编译器会检查语法和分析源代码,产生的是一个托管模块


注:

托管模块是一个可以在CLR中执行的PE(Portal Executable)文件。

书中介绍托管模块由PE32或PE32+头、CLR头、元数据、IL(中间语言)代码。看的时候个人觉得理解元数据和IL比较重要。

    元数据:包含两种类型的元数据表:一个表描述源代码中定义的类型和成员;另一个表描述源代码引用的类型和成员 。

    IL(中间语言)代码:编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本地CPU指令。(IL代码有时称为托管代码,因为CLR要管理它的执行)

2、将托管代码合并成程序集:

(CLR实际不和模块一起工作。相反,他是和程序集一起工作的)

前面说到CLR不会识别你的具体语言,需要相应编译器生成相应的托管模块。这会又说实际不和模块一起工作,引入了程序集的概念。文中说程序集是一个抽象的概念。

托管模块(IL和元数据)、资源文件(.jepg,.gif,.html等)——>将多个托管模块和资源文件合并成程序集的工具(C#编译器    CSC.exe)——>程序集(清单:描述程序集中的文件集)

3、加载公共语言运行时:

你生成的程序集既可以是一个可执行的应用程序,也可以是一个DLL(其中含有一组可执行程序使用的类型)。最终由CLR管理这些程序集中的代码的执行。

  加载公共语言进行时时window的事,我们可以考虑在window的一系列之后会初始化CLR,然后加载exe程序集,然后调用其入口方法Main()。随即,托管的应用程序将启动并运行。

4、执行程序集代码:

在第一步,即源代码编译成托管模块的时候提到:元数据总是和包含IL代码的文件关联,由于编译器同时生成元数据和代码,把他们绑定一起,并嵌入最终生成的托管模块,所以元数据和他描述的IL代码用惯不会失去同步

可想而知,当你调用入口方法(Main)的时候,元数据也跟着进来了,他们是一对好基友

时间: 2024-11-03 22:15:25

底层运行机制CLR-C#的相关文章

<转>ASP.NET学习笔记之理解MVC底层运行机制

ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET MVC的异同点,并展示各自在Web领域的优劣点.在讨论之前,我对这两种技术都非常热衷,我个人觉得在实际的项目开发中,两者都能让我们受益匪浅,因此是目前Web领域两大平行和流行的技术.我们都知道,在传统的ASP.NET Web Form应用程序中,Microsoft已为我们设计了较为完整.简洁的开发

【Spark 深入学习 04】再说Spark底层运行机制

本节内容 · spark底层执行机制 · 细说RDD构建过程 · Job Stage的划分算法 · Task最佳计算位置算法 一.spark底层执行机制 对于Spark底层的运行原理,找到了一副很好的图,先贴上 客户端提交应用后,spark是如何执行的要有一个整体的概念,做到心中有数,先整体把握,才能更好的分模块开垦细节,废话不多说,先来看该图如何更好的理解. 1)提交前的联系 Worker向Master或则ResourceManager汇报自己有哪些资源(内存.CPU.磁盘空间.网络等),Ma

JavaScript闭包的底层运行机制

我研究JavaScript闭包(closure)已经有一段时间了.我之前只是学会了如何使用它们,而没有透彻地了解它们具体是如何运作的.那么,究竟什么是闭包? Wikipedia给出的解释并没有太大的帮助.闭包是什么时候被创建的,什么时候被销毁的?具体的实现又是怎么样的? 1234567891011121314151617181920 "use strict"; var myClosure = (function outerFunction() { var hidden = 1; ret

ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制

今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET MVC的异同点,并展示各自在Web领域的优劣点.在讨论之前,我对这两种技术都非常热衷,我个人觉得在实际的项目开发中,两者都能让我们受益匪浅,因此是目前Web领域两大平行和流行的技术.我们都知道,在传统的ASP.NET Web Form应用程序中,Microsoft已为我们设计了较为完整.简洁的开发环境,并提供了复杂的处理引擎,开发者只需简单的拖放控件和编写对应的

PHP的运行机制与原理(底层)

说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来处理请求.文件流.错误处理等相关操作:Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它:扩展层是一组函数.类库和流,PHP使用它们来执行一些特定的操作.比如,我们需要mysql扩展来连接MySQL数据库:当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还: 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAP

IIS 内部运行机制

ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices --这些都在ASP.NET层次结构在最高层. 这篇文章的资料收集整理自各种微软公开的文档,通过比较 IIS5.IIS6.IIS7 这三代 IIS 对请求的处理过程, 让我们熟悉 ASP.NET的底层机制并对请求(request)是怎么从Web服务器传送到ASP.NET运行时有所了解.通过对底层机制

深入理解ASP.NET的内部运行机制(转)

WebForms和WebServices作为.NET平台构建Web程序的两大利器,以其开发简单.易于部署的特点得到了广泛的应用,但殊不知微软公司在背后为我们做了大量的基础性工作,以至于我们开发人员只需简单地拖拖控件.写写一些页面级的代码就可以轻松地实现一些简单的应用程序.当然这种封装也不是没有好处的,至少从开发的角度而言它就可以极大地降低开发的难度,但是这种过度的封装使得我们开发人员当遇到有可能由底层引起的问题时就会束手无策,而且也会使得我们对知识的掌握和理解只停留在了表面而不得其内在本质.正是

MVC运行机制[转]

原:http://www.cnblogs.com/jyan/archive/2012/06/29/2569566.html#3122335 ASP.NET是一种建立动态Web应用程序的技术.它是.NET框架的一部分,可以使用任何.NET兼容的语言编写ASP.NET应用程序.相对于Java.PHP等,ASP.NET具有方便性.灵活性.性能优.生产效率高.安全性高.完整性强及面向对象等特性,是目前主流的网络编程技术之一.它可以让开发者快速高效的创建应用程序而不必关注Http,Html,Javascr

【转】图解 HTTP协议/IIS 原理及ASP.NET运行机制浅析

前言 前一段在整理邮件的时候发现几年前和CDD老师交流时的一份邮件.下面是简单摘要: “从技术角度来说,无论哪一个阵营,跟新技术都是不可避免的,也是很累的,当然作为一个程序员来说,也是必须的.要想让技术的更新对自己的影响减小,基础就必须打牢.所以,底层的东西和抽象层的东西需要下一番功夫.因为说到底,无论什么技术,无非就是架构和最终的实现,技术框架只是应用开发的一个平台一种技术,如果了解了具体的东西,技术更新对你来说就没什么影响了,或者换句话说,你要学一种新的技术,速度和效率会非常之高.” 上面一