public sealed class Program{
public static void Main() {
System.Console.WriteLine("Hi");
}
}

程序运行时,CLR会加载并初始化它。CLR读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken。然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT(just-in-time)编译成本地(native)代码。编译时会对代码进行验证以确保类型安全性。最后,将执行本地代码。下面展示了Main方法的IL代码。(运行ILDasm.exe可以生成)

.method public hidebysig static void Main() cil managed
//SIG: 00 00 01
{
.entrypoint
//Method begins at RVA 0x2050
//Code size 11 (0xb)
.maxstack
IL_0000: /* 72 | (70)000001 */
ldstr "Hi"
IL_0005: /* 28 | (0A)000003 */
call void [mscorlib]System.Console::WriteLine(string)
IL_00a: /* 2A | */
ret
}//end of method Program::Main

对这个代码进行JIT编译时,CLR会检查对类型和成员的所有引用,并加载定义了它们的程序集(如果尚未加载)。可以看出,上述IL代码有一个对System.Console.WriteLine的引用。具体地说,IL call 指令应用了token 0A000003.这个token对应于MemberRef源数据表中的记录项3.CLR检查这个MemberRef记录项,发现它的一个字段引用了一个TypeRef表中的一个记录项(System.Console类型)。根据TypeRef记录项,CLR被引导至一个AssemblyRef记录项:“mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”.这样,CLR就知道了它需要的是哪一个程序集。接着,CLR必须定位并加载该程序集。

解析一个引用的类型时,CLR可能在以下三个地方找到类型。

  • 同一个文件
  • 不同的文件,同一个程序集
  • 不同的文件,不同的程序集

下图为一个类型绑定的图解过程:

最新文章

  1. 区间dp总结篇
  2. 接口测试第十二课(fidller过滤)(转)
  3. EntityFrameWork使用
  4. github-ssh
  5. SQL语句中count(1)count(*)count(字段)用法的区别
  6. 阿里云DRDS:分布式数据库服务
  7. (进阶篇)Cookie与 Session使用详解
  8. ViewPager 滑动页(三)
  9. hibernate hbm2ddl auto 不能创建表的问题
  10. Eclipse Clojure 开发插件
  11. FineUI Grid 缓存列显示隐藏状态
  12. 一个好用简单的布局空间EasyUI
  13. .net做的exe和electron做的exe之间的通信问题
  14. vim下单行长文本的时候卡顿解决办法
  15. Linux系统软件安装的几种方式
  16. 关于GCJ02和WGS84坐标系的一点实验
  17. hbase 性能优化 (转载)
  18. centos7.5 安装gaussian09和 gaussianview4
  19. 第一册:lesson fifty three。
  20. redis复制

热门文章

  1. Android 媒体编解码器(转)
  2. django的render的说明
  3. Oracle pl/sql 记录、表类型
  4. html标签的显示模式(块级标签,行内标签,行内块标签)(转)
  5. SqlServer中把结果集放到到临时表的方法(转)
  6. 解析IFC数据并转成json格式
  7. CentOS6.5 安装python
  8. 终极解决傻X阿里钱盾新手开店及老卖家复核身份证照片模糊无法对焦问题
  9. GitHub Pages搭建博客HelloWorld版
  10. Head First HTML与CSS(第2版) 中文pdf扫描版​