zoukankan      html  css  js  c++  java
  • 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用

    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 8
       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可能在以下三个地方找到类型。

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

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

  • 相关阅读:
    Java数据结构与算法(24)
    urllib2使用总结
    Python常见文件操作的函数示例
    Java数据结构与算法(23)
    python代码风格检查工具──pylint
    Python抓取框架:Scrapy的架构
    Java数据结构与算法(22)
    【codeforces 431D】Random Task
    【codeforces 449C】Jzzhu and Apples
    【codeforces 20B】Equation
  • 原文地址:https://www.cnblogs.com/lishidefengchen/p/4445974.html
Copyright © 2011-2022 走看看