"运行时"如何解析类型引用
2014-08-13 15:33
169 查看
先将下面的代码保存到文本中,存放到一个目录下面,E:\aa.txt
编译上面的文本文件:
Program.exe是一个托管PE文件,由4个部分构成:PE32(+)头、CLR头、元数据以及IL。运行Program.exe时,CLR会加载并初始化它。然后,CLR读取程序集的CLR头,查找标识了应用程序入口的方法(Main)的MethodDefToken。然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT编译成本地代码。编译时会对代码进行验证以确保类型安全性。最后,将执行本地代码。
下面展示了Main方法的IL代码。为了获取这个输出,请运行ILDasm.exe,选择“视图”|“显示字节”,然后双击树形视图中的Main方法。
对这个代码进行JIT编译时,CLR会检查对类型和成员的所有引用,并加载定义了它们的程序集。可以看出,上述IL代码有一个对System.Console.WriteLine的引用。具体地说,IL call指令引用了元数据token 0A000003。这个token对应于MemberRef元数据表(表0A)中的记录项3。CLR检查这个MemberRef记录项,发现它的一个字段引用了一个TypeRef表中的一个记录项(System.Console类型)。根据TypeRef记录项,CLR被引导至一个AssemblyRef记录项:“mscorlib, version=4.0.0.0, culture=neutral, PublicKeyToken=b77a5c561934e089”。这样,CLR就知道了它需要的是哪一个程序集。接着,CLR必须定位并加载该程序集。
public sealed class Program{ public static void Main(){ System.Console.WriteLine("Hi"); System.Console.Read(); } }
编译上面的文本文件:
Program.exe是一个托管PE文件,由4个部分构成:PE32(+)头、CLR头、元数据以及IL。运行Program.exe时,CLR会加载并初始化它。然后,CLR读取程序集的CLR头,查找标识了应用程序入口的方法(Main)的MethodDefToken。然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT编译成本地代码。编译时会对代码进行验证以确保类型安全性。最后,将执行本地代码。
下面展示了Main方法的IL代码。为了获取这个输出,请运行ILDasm.exe,选择“视图”|“显示字节”,然后双击树形视图中的Main方法。
对这个代码进行JIT编译时,CLR会检查对类型和成员的所有引用,并加载定义了它们的程序集。可以看出,上述IL代码有一个对System.Console.WriteLine的引用。具体地说,IL call指令引用了元数据token 0A000003。这个token对应于MemberRef元数据表(表0A)中的记录项3。CLR检查这个MemberRef记录项,发现它的一个字段引用了一个TypeRef表中的一个记录项(System.Console类型)。根据TypeRef记录项,CLR被引导至一个AssemblyRef记录项:“mscorlib, version=4.0.0.0, culture=neutral, PublicKeyToken=b77a5c561934e089”。这样,CLR就知道了它需要的是哪一个程序集。接着,CLR必须定位并加载该程序集。
相关文章推荐
- 3.8 “运行时”如何解析类型引用
- C# 引用类型的"祸害"
- 如何解决“引用了实体 "nbsp", 但未声明它”
- 如何解决"无法直接启动带有类库输出类型的项目"
- xml解析----元素类型 "XXXX" 必须由匹配的结束标记 "</XXXX>" 终止。
- 无法用 "CString" 类型的值初始化 "CWnd &" 类型的引用(非常量限定)
- 第三方控件引起的"类型Universe无法解析程序集"
- java引用传递值传递的"深入"解析与c++中的值传递
- “对象被多次指定;已忽略多余的指定”并伴有"无法解析的外部符号 "xxx",该符号在函数 "xxx"中被引用的错误"
- C++ 的"const char* const*"类型解析
- 如何解决“引用了实体 "nbsp", 但未声明它”
- [jvm解析系列][三]Java的垃圾回收(一)如何鉴别垃圾,四种引用类型
- 提交表单,有两个页面,一个是系统日志,一个是运行日志,其中日志类型不能用同一个"name",否则其中一个会出现404页面,可能是缓存问题吧(API?)
- (C#打基础)"引用类型按值传递 " 与 "引用类型按引用传递"
- 解析java中对象的"引用"
- "未能找到类型或命名空间名称",引用dll的时候出错
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用
- JSON解析,类型是{"a":"b","c":"d"}的
- CLR如何解析类型引用
- 如何在运行时确定对象类型(RTTI)