Runtime怎样解析类型引用

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 界的经典之作,读的过程写点笔记跟大家分享,我也推荐大家看英文版,能够直接领会原意 

作者:张雪飞
出处:https://zhangxuefei.site/p/116
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

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