我們在用Visual Studio進行開發的時候,經常會跟dll或者exe的文件打交道,懂一點計算機的同學會想,dll文件里面存的應該是二進制吧,它不能直接運行,不過可以被exe的程序調用。懂點.Net的同學:哦,原來dll文件中存放的是經過編譯后的MSIL,運行時,它會由一個叫JIT的編譯器再編譯為適合本地運行的二進制,供程序運行。那么今天,作為懂得不是一點點的我們,就應該了解這里面到底是些什么東西,這樣會更好的理解.Net框架。已經不記得是在哪里記下的哪位大神筆記,貼在自家牆上的,如今拿出來曬曬,只為跟眾多園友們分享分享!
如圖所示:
在.Net Framework下,一個dll/exe文件也叫一個程序集,可以把它看作是一個程序的集合,因為程序要運行,除了必要的代碼以外,可能牽扯到相關的圖像,視頻等等,而程序集,就是這些東西了一個集合。
下面對圖中的名詞一一介紹:
PE/COFF:Windows 操作系統能加載並執行.dll和.exe文件,是因為它能夠理解PE/COFF格式.PE/COFF( Micorsoft Windows Protable Executable/Commom Object File Format )——可移植可執行/通用對象文件格式。PE/COFF頭包含了供操作系統查看和利用的信息,如文件指針等等。
CLR 頭:程序集中包含的CLR代碼,並不是計算機可以直接運行的,還需要進行即時編譯。所以,需要將編譯環境運行起來,因此,PE/COFF之后就是CLR頭,告訴操作系統這個文件是一個.Net程序集,區別與其他類型的可執行程序。
清單:相當於一個目錄,描述了程序集本身的信息,如程序集標識(版本號,名稱等),資源(Resources),組成文件。
元數據:描述了程序集所包含的內容,包括:程序集包含的模塊、類型、成員、可見性等。注意:元數據並不包含類型的實現,類似於C/C++中的.h頭文件,在.Net中查看元數據的過程就叫“反射”。
CIL代碼:元數據中類型的實現,包括方法體、字段等,類似於C++中的.cpp文件。
資源文件:如音樂,圖片等。