- using System;
- public class MyApp
- {
- public static int Main()
- {
- int ValueOne = 10;
- int ValueTwo = 20;
- Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo));
- return 0;
- }
- public static int Add(int One, int Two)
- {
- return (One + Two);
- }
- }
接下來的是上面Main函數的IL代碼。你可以使用ILDasm.exe去查看任何.NET應用程序的MSIL語言和元數據,不過個人推薦使用Reflector.exe。
- .entrypoint
- .maxstack 3
- .locals ([0] int32 ValueOne,
- [1] int32 ValueTwo,
- [2] int32 V_2,
- [3] int32 V_3)
- IL_0000: ldc.i4.s 10
- IL_0002: stloc.0
- IL_0003: ldc.i4.s 20
- IL_0005: stloc.1
- IL_0006: ldstr "The Value is: {0}"
- IL_000b: ldloc.0
- IL_000c: ldloc.1
- IL_000d: call int32 ConsoleApplication.MyApp::Add(int32,int32) /* 06000003 */
即時編譯器從整個方法中讀取MSIL代碼,分析代碼,然後生成相應的本地指令。在IL_000D,即時編譯器發現了一個Add方法的標記,即時編譯器使用Add這個標記去向元數據中方法定義表MethodDef中找尋,結果在該表的第三行找到了。
接下來的表格顯式了MethodDef表的一部分。受控代碼生成的受控模塊中還有其它各種各樣的表,此處只討論MethodDef表。
該表的每一列都包含重要的信息。運行時通過RVA列的值去計算出絕對位置。ImpIFlags和Flags兩個列包含一些位標記來描述方法。Name列允許運行時根據該列中的名字去從string heap中索引。Signature列允許運行時從blob heap中索引方法簽名。
使用元數據,運行時能夠訪問到所有它需要的信息(去何處裝載你的代碼以及如何去處理等)。在這種意義上,元數據是一種自描述文件。