1. 程式人生 > >CLR,程序集、反射和控制反轉

CLR,程序集、反射和控制反轉

表頭 p s 一個 html 中間 回顧 XML 支持 機器

以前面試包括自己學習的時候經常會碰到這3個東西,也查過相關介紹,晦澀難懂,雖然看完之後,當時勉強理解,不過過一段時間又忘了。其實這篇文章可以分兩篇(clr、程序集)和(反射、控制反轉)來寫,但它們之間有著內在的聯系,我這裏把它們放到一起學習,以便於自己的深入記憶和理解。最後也是希望大家關註一下原理的東西,不了解.Net Framewor怎麽設計優秀的.net框架呢?多學多看多回顧,才能將知識點融會貫通。

CLR

CLR(Common Language Runtime,簡稱CLR)通用語言運行時,它是.net框架的核心,意思就是可被各種不同語言所使用的運行時。vs的ide中有托管擴展C++,C#,VB等等,說明vs中集成了各種面向CLR的語言編譯器。當我們用不同的語言編寫代碼時,編譯器就會對應將我們的代碼編譯成面向CLR的代碼。有什麽好處呢,比如在數學和金融領域的應用中,在表達相同意圖的情況下,Python將會比C#節省好幾天時間。還有一些模塊如果對性能有要求,C++編寫的代碼肯定會比C#快。

為了加深一下理解,可以看一下最近比較好的一篇博客,.net環境下跨進程、高頻率讀寫數據。看完還可以順便理解一下Redis。

程序集

說程序集之前,先來了解一下什麽是托管模塊,通過前邊介紹,我們可以通過任何支持CLR的編程語言來創建源代碼文件,然後通過相應的編譯器做代碼檢查和源代碼分析,但是不管使用了何種的編譯器,最後生成的結果都是一個托管模塊(一種需要CLR才能執行的可移植可執行(p‘ortable executable簡稱PE)的文件),下圖展示了將源代碼編譯成托管模塊

技術分享圖片

托管模塊包含,PE表頭、CLR表頭、元數據和IL中間代碼。這裏詳細介紹下元數據的用處,方便後邊理解反射。

元數據用處:

1、元數據省去編譯時對頭文件和庫文件的需求,因為含有類型和成員和中間代碼已經包含所有被引用的類型和成員信息。編譯器可以通過托管模塊讀取元數據來獲得這些信息。

2、可以利用元數據來輔助我們編寫代碼(某個類型提供哪些方法,某個方法有哪些參數)

3、CLR的代碼驗證可以利用元數據來確保代碼執行安全的操作。

4、利用元數據,我們可以將一個對象的字段序列化到一個內存塊中,然後遠程傳送到另外一臺機器,最後在遠程機器上執行反序列化,從而重新創建對象和它的狀態

(例如xml webservice)。

5、利用元數據,垃圾收集器可以追蹤對象的生存期。

CLR並不與托管模塊打交道,它與程序集(exe或dll)打交道,於是編譯器需將托管模塊組合成程序集,如圖所示:

技術分享圖片

反射

理解反射之前,最好先寫一下代碼再來看此介紹,會很好的理解。元數據其實就一堆表,當我們生成程序集或者模塊時,編譯器會創建一個類型(Type)定義表、字段定義表、方法定義表等等;system.reflection命名空間的某些類型會使得我們能夠編寫代碼來分析這些元數據(這其實就是反射),並為這些元數據建立對象模型,然後利用元數據的對象模型的類型,我們可以根據一個類型定義表得到他包含的所有類型,對於每一個類型 ,我們又可以獲得他的基類型、它實現的接口和相關聯的一些標記,還可以利用 system.reflection命名空間的類型來獲取一個類型的字段、屬性、方法和事件,而且可以獲取元數據的定制特性(Attribute)。

控制反轉

這裏建議看一下反射機制、依賴註入、控制反轉這篇文章!寫的挺好。後續有時間爭取寫一些反射和控制反轉的實例代碼,方便大家學習!!!

總結一下

將不同的知識點串聯起來學習,真的是一個很好的方式,鼓勵大家多多學習,多多總結,早日成為大牛!!!

CLR,程序集、反射和控制反轉