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

生成、打包、部署和管理應用程序及類型(二)

其中 執行c led 包含成員 托管 stat rtu abs top

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

生成、打包、部署和管理應用程序及類型(二)