.net知识和学习方法系列(十六) CLR-托管理程序和它的运行
2009-02-27 16:20
363 查看
大家都知道, vs生成的是托管理程序(不管是 VB.net还是 C#),托管理程序是什么呢?托管这个词就能隐约得告诉我们,这个程序运行时不那么 “单纯”,其实,托管理程序是不可以直接在 CPU上运行的,至于为什么,我们先看一下托管程序的组成部分。
一般托管理程序分为
PE文件头:包含文件的类型,还有生成文件的时间
CLR头:包含 CLR版本,入口方法的元数据标记
元数据:定义的类型和成员,引用的类型和成员
IL(中间语言):编译源代码时生成的代码
现在来看一下托管理代码的运行,有这样一个简单的方法
复制代码
当 IDE把把这个代码编译成 exe后,我们运行起这个 exe(当然是在装有 .net Framework的计算机上 ),首先 CLR会扫描所有这个 Main方法中的类型,然后会创建一个用于管理这些类型的数据结构,虽然本例中只有一种类型 Console,并且还是一个静态类。在这个数据结构中,存放着很到记录,每个记录与 Console的一个方法对应着,每个记录中,包含着一个指向方法实现的内存地址。
当这个数据结构初始化时, CLR就将数据结构中的每条记录指向一个在 CLR中已定义好的方法 CallMethod(我假设的名子),这个方法能根据记录找到方法实现,当执行 Console.WriteLine(“谢谢!”)时,会在数据结构中找到对应的记录,这个记录会调起 CallMethod方法, CallMethod这个方法要实现 步骤如下:
调用元数据中的 WriteLine方法 (因为记录与 CallMethod关联,记录指向方法的实现地址,所以 CallMethod能调用 WriteLine方法)
从元数据中得到这个方法的 IL
申请一块内存空间
把这个方法编译成 CPU指令,放到申请的内存空间中
然后这个方法返回到这个数据结构中的 WriteLine方法对应的那条记录,用申请的内存地址替换掉这个记录包含指向方法实现的内存地址(这里就是用 CPU指令所在的内存地址替换掉了实现方法的内存地址)
返回 Main方法的 Console.WriteLine(“阅读”)
当 CLR执行 Main方法的 Console.WriteLine(“阅读”)时,因为记录中的内存地址已变成了 CPU指令所在的内存地址,所以这次, CallMethod方法就不用被重新调用,这就说明,一旦该方法第一次被调用过,以后的调用就相对的节省资源了。直到该程序中止退出。
如果该程序在一台计算机上启动了两个,它们的这个该方法的 CPU指令是不会被共用的,因为他们不在一个 Application Domain,不能跨域访问。
感谢:http://msdn.microsoft.com/zh-cn/dd366055.aspx
一般托管理程序分为
PE文件头:包含文件的类型,还有生成文件的时间
CLR头:包含 CLR版本,入口方法的元数据标记
元数据:定义的类型和成员,引用的类型和成员
IL(中间语言):编译源代码时生成的代码
现在来看一下托管理代码的运行,有这样一个简单的方法
复制代码
using System; class Democlass { static void Main() { Console.WriteLine("谢谢!"); Console.WriteLine("阅读。"); Console.WriteLine("再见!"); } }
当 IDE把把这个代码编译成 exe后,我们运行起这个 exe(当然是在装有 .net Framework的计算机上 ),首先 CLR会扫描所有这个 Main方法中的类型,然后会创建一个用于管理这些类型的数据结构,虽然本例中只有一种类型 Console,并且还是一个静态类。在这个数据结构中,存放着很到记录,每个记录与 Console的一个方法对应着,每个记录中,包含着一个指向方法实现的内存地址。
当这个数据结构初始化时, CLR就将数据结构中的每条记录指向一个在 CLR中已定义好的方法 CallMethod(我假设的名子),这个方法能根据记录找到方法实现,当执行 Console.WriteLine(“谢谢!”)时,会在数据结构中找到对应的记录,这个记录会调起 CallMethod方法, CallMethod这个方法要实现 步骤如下:
调用元数据中的 WriteLine方法 (因为记录与 CallMethod关联,记录指向方法的实现地址,所以 CallMethod能调用 WriteLine方法)
从元数据中得到这个方法的 IL
申请一块内存空间
把这个方法编译成 CPU指令,放到申请的内存空间中
然后这个方法返回到这个数据结构中的 WriteLine方法对应的那条记录,用申请的内存地址替换掉这个记录包含指向方法实现的内存地址(这里就是用 CPU指令所在的内存地址替换掉了实现方法的内存地址)
返回 Main方法的 Console.WriteLine(“阅读”)
当 CLR执行 Main方法的 Console.WriteLine(“阅读”)时,因为记录中的内存地址已变成了 CPU指令所在的内存地址,所以这次, CallMethod方法就不用被重新调用,这就说明,一旦该方法第一次被调用过,以后的调用就相对的节省资源了。直到该程序中止退出。
如果该程序在一台计算机上启动了两个,它们的这个该方法的 CPU指令是不会被共用的,因为他们不在一个 Application Domain,不能跨域访问。
感谢:http://msdn.microsoft.com/zh-cn/dd366055.aspx
相关文章推荐
- .net知识和学习方法系列(十六)CLR-托管理程序和它的运行
- .net知识和学习方法系列(十六)CLR-托管理程序和它的运行
- .net知识和学习方法系列(二十一)CLR-枚举
- .net知识和学习方法系列(二十二)CLR-方法的参数out,ref
- .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型
- .net知识和学习方法系列(二十)CLR-委托
- .net知识和学习方法系列(十八)CLR-构造函数
- .net知识和学习方法系列(十九)CLR-事件
- .net知识和学习方法系列(二十)CLR-委托
- .net知识和学习方法系列(十八)CLR-构造函数
- .net知识和学习方法系列(二)CSharp的程序结构
- .net知识和学习方法系列(二十一)CLR-枚举
- .net知识和学习方法系列(二十二)CLR-方法的参数out,ref
- .net知识和学习方法系列(三)CSharp中控件台的输入输出
- .net知识和学习方法系列(二十三)嵌套类
- .net知识和学习方法系列(二十四)struct中的全局变量
- .net知识和学习方法系列(六)关于数值类型
- 当运行多个.net程序的时候,系统中有多少CLR的实例
- .net知识和学习方法系列(前言)
- .net知识和学习方法系列