2012-05-16 57 views
2

我最近開始在VS2010中使用ILVisualizer來檢查IL的動態方法。但是它並沒有從IL流中提取LocalVariable信息,所以我試了一下(當然,爲了它的樂趣,並且因爲它是一個很好的學習體驗:)閱讀DynamicMethod的LocalSignature:非標準類型標記?

對於靜態編譯的方法,這不是一個問題,因爲我們可以通過GetMethodBody()來訪問方法的主體,並從那裏獲取局部變量。

但是,使用DynamicMethods方法主體不能通過GetMethodBody()獲得。我發現了一種解決方法,它將本地簽名作爲字節數組獲取,從那裏我可以提取方法當地人的計數,類型和索引,根據CIL規範。只要我們正在處理本地類型(短,字節,字符串...),就一切都好。

但是,如果一個局部變量是一個類類型,它將被本地簽名中的ELEMENT_TYPE_INTERNAL(0x21)標誌而不是ELEMENT_TYPE_CLASS引用。

不幸的是,我無法找到關於如何讀取存儲爲ELEMENT_TYPE_INTERNAL的類型的任何內容。 這是怎麼回事? MS是否使用動態方法的非標準CIL?任何人都知道如何正確閱讀這些簽名?

編輯我偶然發現mscorlib.dll的一些源文件,並從SignatureHelper的源中發現,當類是運行時類型時可能會發生這種情況。我會調查...

回答

1

嗯,我相信我明白了!

事實證明,ELEMENT_TYPE_INTERNAL標誌之後的數據不是壓縮數據,它是一個普通的32位整數(或64,取決於平臺,儘管我必須證實)存儲在4個字節上,這是指向引用類型的指針。

即使我找不到從IntPtr中獲取RuntimeTypeHandle的方法,但通過循環方法的DynamicScope對象中的標記並比較值可以獲取類型句柄。