好了,還是這張圖,還是一樣的Hello world。
因為本章其實很多都是講一些命令行編譯啊什麼鬼的配置類的東西,要用的時候直接百度或者回頭查書就可以了,
所以了解一下也就行了,也沒有記錄下來,接下來講得只是我認為很有用的東西。
關於引用
請看上圖,MyTest程序集下面有個引用,引用裡面大家都知道有很多dll,而我們的源代碼中只有那5個using引用某dll裡的具體的命名空間。
(引用這些dll只會對編譯器造成一點影響,並不會影響最終生成的文件,更不會去影響最終的性能)
也就是說,無論你引用多少個dll,你的源代碼中只使用那5個using,那麼最終引用的實際上只有包含這5個using的那些dll文件。
再說PE文件,程序集,托管模塊,元數據
之前我們說了托管PE文件(也就是那些exe,dll)包括4個部分:PE頭、CLR頭、元數據和IL代碼。
其中PE頭是windows要求的標准信息,CLR頭是托管模塊特有的,包括CLR版本號,模塊的入口方法,數字簽名,模塊內部元數據表的大小和偏移。
元數據是由幾個表構成的二進制塊,有三種元數據表:定義表,引用表和清單表。
所謂定義表,主要就是對本模塊內部的一些屬性,方法什麼的一個描述。
所謂引用表,主要就是對引用的程序集內部的一些屬性,方法什麼的一個描述。
所謂清單表,主要就是對程序集組成的那部分文件的信息。
程序集是進行重用、版本控制和應用安全性設置的基本單元。允許有將類型和資源文件劃分到單獨的文件中。(程序需要加載的程序集數量越少,性能越好,因為這樣有助於減小工作集,緩解進程空間地址碎片化)
CLR操作的就是程序集,先加載包含清單元數據表的文件,再根據清單來獲取程序集中其它文件的名稱。
好吧,我們主要還是來講上述四者的關系
結合上圖的Hello world程序,來看看我自己的理解:
源代碼都會生成托管PE文件,也叫托管模塊,就是那些dll和exe,而一個托管模塊包含:PE頭、CLR頭、元數據定義表、元數據引用表和IL代碼。
而這些托管模塊和一些圖片啊什麼的資源文件,再加上一個元數據清單表就組合成了程序集(程序集是一個邏輯上的概念)。
一個PE文件也可以僅僅只是一個托管模塊,也可以是一個程序集,而區分一個PE文件是托管模塊還是程序集的關鍵就是看它有沒有元數據清單表。
那麼最通俗的講,a.EXE引用了b.dll,那麼a.exe就是一個程序集,但是b.dll引用了c.dll那麼b.dll其實也是一個程序集。
同時a,b,c都是托管PE文件,都是托管模塊。
可能饒了點,上述理解中如有纰漏還望看到的大神指出,以免本人在錯誤的道路上越走越遠。