程序集的內部結構spa
在看程序集的結構以前,咱們先來看託管模塊的結構。3d
託管模塊由四部分組成:PE32頭、CLR頭、元數據(Metadata)、IL代碼。其中PE32頭是用來決定託管模塊運行的系統環境(32位、64位)的,CLR頭飾用來描述CLR版本等信息的,這二者不是咱們的重點,咱們主要來討論元數據,和IL代碼。元數據實際上是一些用來描述程序集、託管模塊、類型、類型的成員之間的關係的表(tables),咱們能夠將這些表分爲三類 定義表、引用表、Manifest,咱們一般所受的託管模塊是不包含Manifest的。下面是託管模塊的示意圖:blog
經過模塊的入口咱們能夠找到全部的類型,經過類型的入口咱們能夠找到她的全部的成員的入口,就能找到全部的成員,成員方法的入口會有指向IL代碼的索引,因此咱們只要有模塊的入口就能夠拿到入口中的說有元素了。另外咱們還能夠看出處理方法和屬性成員之外其餘的元素都是用元數據描述出來的,只有這二者是有IL代碼的描述的。索引
如今應該把Module的結構明確了,接下來就是程序集了,程序集是由託管模塊編譯獲得的,程序集有多種形態,有單文件程序集、多文件程序集,單文件程序集只包含一個物理文件,多文件程序集包含多個物理文件。咱們平時用VS建立的項目都是被編譯成一個單文件程序集(VS不支持多文件程序集的建立),它只包含一個託管模塊,這個託管模塊就是咱們的程序集,與通常的託管模塊不一樣的是,它會包含Manifest類型的一些表,咱們就是利用這些表來描述程序集中託管模塊的分佈,從而將託管模塊從邏輯上來關聯成爲一個程序集的。編譯
Manifest包含的表有:table
Manifest 中還包含一些引用表,是用來描述程序集中全部模塊引用的程序集的入口的,這樣在咱們加載程序集的時候,就能夠根據這個表知道有哪些程序集被引用了,下面是多文件程序集的兩種可能的結構:引用
機構一:程序
結構二:方法
上述內容均來自《CLR》,如理解有誤,還請指出im