我們的團隊開發了用於查找項目中Changed方法參考的工具。 1.我們使用反射來讀取名稱空間,類名和方法名稱的e.t.c. 2.我們開始在cs文件中搜索方法體,並將其存儲在列表中。 3.我們已經採取了每種方法來查找參考文件的 但我已經看到使用.dll來讀取完整源代碼的反射工具。 如何發生?有沒有辦法從反射中讀取源代碼?請幫助我解決這個問題 在此先感謝從.dll中讀取完整的源代碼有什麼用?
回答
反射器實際上沒有讀取源代碼 - 因爲它不在那裏。相反,它需要IL並對其進行反編譯,以確定源代碼可能是的外觀。
這就是它是如何能夠證明你在多語言代碼 - 顯然代碼不實際上寫在(比方說)VB和C#,但反射器可以通過工作中的代碼做什麼,並試圖告訴你兩個找到可以做同樣事情的源代碼。
(這不是總是這是由東西像迭代器塊或異步方法哪裏有是沒有直接等同有效的C#C#編譯器生成的IL的成功,順便說一句,有時有位。)
這樣做實際上是一個多步驟的過程。您將從DLL或EXE中獲得的是IL字節碼,它本質上是一種抽象的機器語言。該IL字節碼可以一對一地轉換爲IL彙編語言(例如通過ILDASM或反射器的原始IL模式)。
反射器的C#語言反編譯模式採取它的工序更遠,從類似於if
/else
,while
循環,switch語句等,並且轉換該代碼挑選出的結構,對對應的語句。有關局部變量名稱的信息不會保存在IL中,因此必須隨着這些信息一起完成。另外,一些控制結構可能已經被優化而不易於識別,所以往往會導致產生goto
報表。還有一些結構在C#語言中沒有直接的相似性,因此您可能會在反編譯的代碼中找到非官方擴展關鍵字,例如methodof
。
一個有趣的練習是在反編譯到早期版本的語言時檢查如何翻譯新的C#代碼。例如,LINQ查詢解析被翻譯爲IEnumerable<T>
上的方法鏈,傳遞給Expression<T>
的lambdas參數被一大堆goo替換,以構建並傳遞對應於lambda的抽象語法樹 - 事實上,這樣的構造是什麼由編譯器翻譯。
其實我們正在做的是正確與否? – 2010-11-02 08:30:04
如果您正在嘗試構建方法調用圖,則編譯後的代碼將包含您應該需要的所有內容。您可能需要查看FxCop SDK,其中包含用於從編譯代碼分析方法調用圖的非常有用的例程。 – 2010-11-02 21:56:30
- 1. 從源代碼讀取pkgversion
- 2. dom問題:從html文檔中獲取完整的源代碼
- 3. 從源代碼中提取完整的函數定義
- 4. 爲什麼我的JSON響應一個完整的源代碼
- 5. Android源代碼(完整)
- 6. 源代碼html沒有完整下載
- 7. 爲什麼我的Android SDK源代碼不完整?
- 8. 從wicket獲取完整的html代碼
- 9. 「完整源代碼包」是什麼意思
- 10. 讀取Sqlite源代碼。 F17025,U17032這些ID用於什麼?
- 11. 從同一源代碼生成的兩個DLL文件有什麼區別
- 12. 使用Javascript獲取頁面的完整源代碼
- 13. 如何閱讀完整的HTML源代碼與按鈕「多」
- 14. 這是ServiceKnownTypeAttribute的完整源代碼嗎?
- 15. 從網頁中檢索完整頁面的源代碼
- 16. C源代碼DLL
- 17. 如何從javascript或jquery的iframe中獲取完整的源代碼?
- 18. U-SQL提取文件完整內容(從html文件中提取完整源代碼)
- 19. 有沒有什麼辦法可以用itext的資源獲取源代碼
- 20. 要從源代碼安裝matplotlib,什麼是源代碼
- 21. Qt源代碼是否完整?
- 22. ASP.NET MVC View源代碼完整縮進
- 23. 從源代碼目錄中讀取靜態資源
- 24. 無法使用SBT 0.11從「完整配置」生成源代碼
- 25. 保護DLL的源代碼
- 26. 如何從dll文件中提取源代碼?
- 27. 獲取一個網址的完整源代碼
- 28. 我無法獲取網頁的完整HTML源代碼
- 29. 如何獲取FileSystemObject的完整源代碼?
- 30. Apache Nutch 2.1 - 如何獲取完整的源代碼
Ack,ninja'd! :-) – 2010-11-02 07:09:36