生成、打包、部署和管理應用程式及型別(上)
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