生成、打包、部署和管理應用程序及類型(二)
1 生成、打包、部署和管理應用程序及類型
1.1 .net framework 部署目標
Windows一直不穩定和過於復雜(其實也很封閉,逐漸開放,如core),微軟認為主要原因是:
(1)應用程序來自微軟或其他廠商的dll,多個廠商的代碼帶來復雜性。安裝新程序會破壞原有程序,帶來dll hell。
(2)安裝復雜性。大多數應用安裝的時候會影響到系統的全部組件。
(3)安全性。安裝程序會帶來各種文件,許多不同公司開發的。
1.2 將類型生成到模塊中
響應文件包含一組編譯器命令開光的文件,執行csc.exe時,編譯器打開響應文件,並使用其中包含的所有開關。
1.3 元素據概述
元素據是由幾個表構成的二進制數據塊,分別是定義表、引用表、清單表。
模塊元素據常用定義表如下:
元素據定義表名稱 |
說明 |
Moduledef |
總是包含對模塊進行標識的一個記錄項,該記錄項包含模塊文件名、拓展名、模塊版本ID |
Typedef |
模塊定義的每個類型在這個表中都有一個記錄項,包含類型名、基類型、標誌(public、private)、索引,索引指向Moduledef表中該類型的方法、fielddef表中該類型的字段、propertydef表中該類型的屬性以及eventdef表中該類型的事件 |
Methoddef |
模塊定義的每個方法在這個表中都有一個記錄項,包含方法的名稱、標誌(private、public、virtual、abstract,static、final)簽名、方法的IL代碼在模塊的偏移量。還引用了paramdef表中的一個記錄項,包括與方法參數有關的更多信息。 |
Fielddef |
模塊定義的每個字段在這個表中都有一個記錄項,每個記錄項都包含標誌(private、public)、類型和名稱 |
paramdef |
模塊定義的每個參數在這個表中都有一個記錄項,包含標誌(in、out、retval)、類型和名稱 |
Propertydef |
模塊定義的每個屬性在這個表中都有一個記錄項,包含標誌、類型和名稱 |
Eventdef |
模塊定義的每個事件在這個表中都有一個記錄項,包含標誌和名稱 |
編譯器還會檢測源代碼引用的類型、方法、字段、屬性、事件,並創建相應的元素據表記錄項。在創建的元素據中包含一組引用表,記錄了所引用的內容,常用的引用元數據表如下:
引用元素據表名稱 |
說明 |
Assemblyref |
模塊引用的每個程序集在這個表中都有一個記錄項。包含綁定該程序集所需的信息:程序集名稱、版本號、語言文化、公鑰token。還包含一些標誌(flag)和一個哈希值(忽略)。 |
Moduleref |
實現該模塊所引用的類型的每個PE模塊在這個表中都有一個記錄項,包含模塊的文件名和拓展名。可能是別的模塊實現了需要的類型,這個表的作用便是建立同那些類型的綁定關系。 |
typeref |
模塊引用的每個類型在這個表中都有一個記錄項。記錄項包含類型的名稱和一個引用(指向位置)。 |
memberref |
模塊引用的成員(字段方法、屬性方法、事件方法)在這個表中都有一個記錄項,包含成員的名稱和簽名,並指向對成員進行定義的那個類型的typeref記錄項。 |
ILDasm.exe是檢查托管PE的常用工具,通過命令 ILDasm program.exe
生成、打包、部署和管理應用程序及類型(二)