.method public hidebysig static void Main(string[] args) cil managed
// SIG: 00 01 01 1D 0E
{
.entrypoint
// 方法開始於 RVA 0x2050
// 程式碼大小 19 (0x13)
.maxstack 8
IL_0000: /* 00 | */ nop
IL_0001: /* 72 | (70)000001 */ ldstr "Hello World!"
IL_0006: /* 28 | (0A)000004 */ call void [mscorlib]System.Console::WriteLine(string)
IL_000b: /* 00 | */ nop
IL_000c: /* 28 | (0A)000005 */ call string [mscorlib]System.Console::ReadLine()
IL_0011: /* 26 | */ pop
IL_0012: /* 2A | */ ret
} // end of method Program::Main
從IL代碼中看出,Main方法包含了System.Console.WriteLine的引用
根據這個信息,CLR接下來會在Program.cs生成的程序集元數據中檢查MemberRef第4個記錄項(token:0a000004)的位置。然後發現它位於TypeRef的一個記錄項下面。
這個記錄項中的ResolutionScope代表了引用類型的實現位置。
如果類型在另一個類型中實現,引用指向一個TypeRef記錄項,ResolutionScope = 0x01
如果類型在同一個模塊中,引用指向一個ModuleDef記錄項,ResolutionScope = 0x00
如果類型在同一個程序集的另一個模塊中,引用指向一個ModuleRef記錄項,ResolutionScope = 0x1a
如果類型在不同程序集的其他模塊中,引用指向一個AssemblyRef記錄項,ResolutionScope = 0x23
在本例中,按照TypeRef的Resolution又把CLR引導至AssemblyRef的第一個記錄項(0x23000001)。在Program.cs生成的程序集元數據文件中找到AssemblyRef的第一個記錄項,得知它需要的是哪個程序集
AssemblyRef #1 (23000001)
-------------------------------------------------------
Token: 0x23000001
Public Key or Token: b7 7a 5c 56 19 34 e0 89
Name: mscorlib
Version: 4.0.0.0
Major Version: 0x00000004
Minor Version: 0x00000000
Build Number: 0x00000000
Revision Number: 0x00000000
Locale:
HashValue Blob:
Flags: [none] (00000000)
“mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”
CLR定位並加載該程序集