1. 程式人生 > >生成、打包、部署和管理應用程式及型別(上)

生成、打包、部署和管理應用程式及型別(上)

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