Runtime怎样解析类型引用-attach

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

这段代码会被编译集成到一个程序集里面,运行时CLR会加载并初始化。CLR读取CLR header,找到识别程序入口方法(main)的MethodDefToken。

Main方法的IL代码

.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_000a:   /* 2A    |                   */   
            ret  
} // end  of method  Program::Main

当即时编译这段代码时,大体有下面几个过程:

1.CLR会探测所有引用的类型和成员,并且加载定义的程序集。

2.上面的IL代码里面有一个对System.Console.WriteLine的引用。IL的call指令引用元数据token OA000003。这个token标识了在MemberRef元数据表里的入口3。CLR查找MemberRef的入口并发现了一个在TypeRef表(System.Console类型)里指向入口的字段。

3.从TypeRef的入口,CLR会被导向到AssemblyRef入口:”mscorlib, Version=4 . 0  . 0  . 0, Culture=neutral,PublicKeyToken=b77a5c561934e089″。

下图展示CLR怎样创建内部的数据结构(包含所有的入口点)

 注   《CLR via C#》(Jeffrey Richter著)——.NET 界的经典之作,读的过程写点笔记跟大家分享,我也推荐大家看英文版,能够直接领会原意 

发表评论

电子邮件地址不会被公开。 必填项已用*标注