我最近開始在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的源中發現,當類是運行時類型時可能會發生這種情況。我會調查...