2010-11-02 85 views
0

我們的團隊開發了用於查找項目中Changed方法參考的工具。 1.我們使用反射來讀取名稱空間,類名和方法名稱的e.t.c. 2.我們開始在cs文件中搜索方法體,並將其存儲在列表中。 3.我們已經採取了每種方法來查找參考文件的 但我已經看到使用.dll來讀取完整源代碼的反射工具。 如何發生?有沒有辦法從反射中讀取源代碼?請幫助我解決這個問題 在此先感謝從.dll中讀取完整的源代碼有什麼用?

回答

3

反射器實際上沒有讀取源代碼 - 因爲它不在那裏。相反,它需要IL並對其進行反編譯,以確定源代碼可能是的外觀。

這就是它是如何能夠證明你在多語言代碼 - 顯然代碼不實際上寫在(比方說)VB和C#,但反射器可以通過工作中的代碼做什麼,並試圖告訴你兩個找到可以做同樣事情的源代碼。

(這不是總是這是由東西像迭代器塊或異步方法哪裏有沒有直接等同有效的C#C#編譯器生成的IL的成功,順便說一句,有時有位。)

+0

Ack,ninja'd! :-) – 2010-11-02 07:09:36

0

這樣做實際上是一個多步驟的過程。您將從DLL或EXE中獲得的是IL字節碼,它本質上是一種抽象的機器語言。該IL字節碼可以一對一地轉換爲IL彙編語言(例如通過ILDASM或反射器的原始IL模式)。

反射器的C#語言反編譯模式採取它的工序更遠,從類似於if/elsewhile循環,switch語句等,並且轉換該代碼挑選出的結構,對對應的語句。有關局部變量名稱的信息不會保存在IL中,因此必須隨着這些信息一起完成。另外,一些控制結構可能已經被優化而不易於識別,所以往往會導致產生goto報表。還有一些結構在C#語言中沒有直接的相似性,因此您可能會在反編譯的代碼中找到非官方擴展關鍵字,例如methodof

一個有趣的練習是在反編譯到早期版本的語言時檢查如何翻譯新的C#代碼。例如,LINQ查詢解析被翻譯爲IEnumerable<T>上的方法鏈,傳遞給Expression<T>的lambdas參數被一大堆goo替換,以構建並傳遞對應於lambda的抽象語法樹 - 事實上,這樣的構造是什麼由編譯器翻譯。

+0

其實我們正在做的是正確與否? – 2010-11-02 08:30:04

+0

如果您正在嘗試構建方法調用圖,則編譯後的代碼將包含您應該需要的所有內容。您可能需要查看FxCop SDK,其中包含用於從編譯代碼分析方法調用圖的非常有用的例程。 – 2010-11-02 21:56:30

相關問題