運行時如何使用元數據

    爲了更好的理解元數據及其它在CLR中所扮演的角色,自己動手編寫代碼並且演示元數據是怎麼影響CLR是最好的方法。接下來有一個例子,在MyApp中定義了2個方法,Main函數是程序的入口點,Add方法接收兩個int數,返回這兩個整形數的和。
  1. using System;  
  2. public class MyApp
  3. {
  4.    public static int Main()
  5.    {
  6.       int ValueOne = 10;
  7.       int ValueTwo = 20;         
  8.       Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo));
  9.       return 0;
  10.    }
  11.    public static int Add(int One, int Two)
  12.    {
  13.       return (One + Two);
  14.    }
  15. }
    編譯之後生成受控模塊。執行該程序時,運行時加載受控模塊(關於在.net中運行時如何加載受控模塊參考之前的博客 http://blog.csdn.net/lastBeachhead/archive/2008/10/27/3161564.aspx)到內存中,並且向元數據諮詢該類的詳細信息。當必要時,運行時使用即時編譯器把IL語言轉換成本地可執行的機器語言。
接下來的是上面Main函數的IL代碼。你可以使用ILDasm.exe去查看任何.NET應用程序的MSIL語言和元數據,不過個人推薦使用Reflector.exe。
  1.       .entrypoint
  2.       .maxstack  3
  3.       .locals ([0] int32 ValueOne,
  4.                [1] int32 ValueTwo,
  5.                [2] int32 V_2,
  6.                [3] int32 V_3)
  7.       IL_0000:  ldc.i4.s   10
  8.       IL_0002:  stloc.0
  9.       IL_0003:  ldc.i4.s   20
  10.       IL_0005:  stloc.1
  11.       IL_0006:  ldstr      "The Value is: {0}"
  12.       IL_000b:  ldloc.0
  13.       IL_000c:  ldloc.1
  14.       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中索引方法簽名。
    使用元數據,運行時能夠訪問到所有它需要的信息(去何處裝載你的代碼以及如何去處理等)。在這種意義上,元數據是一種自描述文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章