首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

[你必須知道的.NET]第十四回:認識 IL 代碼——從開始到現在

     編輯:關於.NET

本文介紹內容

  • IL 代碼分析方法
  • IL 指令解析
  • .NET 學習方法論

1. 引言

系列開篇以來受關注支持,發現許多園友關注如何理解 IL 代碼。這是好現象——思路從應用向底層轉變。技巧性積累是一方面,底層探索是必不可少修煉。了解 IL 的好處:

  • 通用語言基礎是 .NET 運行基礎,對運行結果有異議時,透過本質看表面需從本質入手,IL 是必知基礎。
  • 元資料與 IL 是 CLR 基礎,了解必要中間語言是深入認識 CLR 捷徑。
  • 大量案例分析以 IL 揭密,了解 IL 是讀懂他人代碼必備基礎。

但不應過分關注 IL。純粹陶醉在 IL 中寫 Hello World 除腦子不好無解釋。凡事追求但不過分。

2. 使用工具

  • ILDasm.exe:.NET Framework SDK 命令提示字元輸入 ildasm 開啟。樹形符號含義可參考 MSDN 經典示例。
  • Reflector(Lutz Roeder 開發):支援 .NET 3.0,功能強大,可反編譯為 IL、C#、VB、Delphi 等,深入了解 IL 最佳利器。

本文以 ILDasm.exe 為說明工具。

3. 分析結構

參閱《第十三回:從 Hello, world 開始認識 IL》,已有大致介紹。IL 結構不複雜,了解大致體系即可。

4. 解析常用指令

IL 指令集含基礎與物件模型指令近 200 個。抓大放小,只取其一瓢獨飲。詳細指令集請下載《MSIL 指令速查手冊》。

4.1 newobj 與 initobj

兩指令如兄弟,常讓人迷惑。代碼引入與指令說明:

深入分析

  • newobj:分配並初始化物件。從受控堆疊分配指定型別所需全部記憶體;調用建構函數初始化前,先初始化物件附加成員(指向方法表指標、SyncBlockIndex);最後調用 ctor 初始化,返回新物件參考位址。(詳見第五回)
  • initobj:初始化值類型。構造新值類型完成初始化,不需調用值類型建構函數。執行結果:將值類型中參考型別初始化為 null,基元型別置為 0。也用於將指定儲存單元指標置空。

區別總結

newobjinitobj
用途分配並初始化物件初始化值類型
記憶體堆疊分配堆疊已分配,僅初始化
建構函數調用不調用,直接置空
分配過程有無,僅資料初始化

其他:newarr 建立一維零基陣列;多維或非零基陣列仍用 newobj。string 建立由 ldstr 完成。

4.2 call、callvirt 與 calli

三指令完成方法調用:

  • call:靜態調度,依引用型別靜態型別調度方法。
  • callvirt:虛擬調度,依引用型別動態型別調度方法。
  • calli:間接調用,透過函數指標執行方法調用。

但 call 某情況可調虛方法,callvirt 也可調非虛方法。具體分析留待後文。

5. 結論

本文從重點 IL 指令開始,力求透過對比分析揭開 IL 神秘與迷惑。對 IL 探求如腳步般持續,為在 .NET 技術世界有更多領悟。期望逐漸與大家一起從 IL 世界探求 .NET 世界,後續將間或繼續此主題成長。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved