(一)CLR介紹
CLR是一個可以由多編程語言使用的運行時,CLR的核心功能:內存管理,程序集加載,安全性,異常處理,線程同步等等。可以被很多屬於微軟系列的開發語言使用。
事實上,在運行時,CLR根本不關心開發運用什么語言編寫源代碼,這意味着選擇編程語言的時候,應該選擇最容易表達自己意圖的語言。只要編譯器是面向CLR的即可。
那為毛微軟還推出C#,F#,VB等等呢,事實上,可以將編譯器視為語法檢查器和正確的代碼分析器。他們檢查源代碼,確定你寫的一切都有意義,並輸出對你意圖進行描述的代碼,不用編程語言之間可以采用不同的y發來開發。微軟幫助我們創建了很多個面向CLR的語言編譯器,其中包含:C#,C++,F#等等。以及一個中間語言匯編器。
(二)托管模塊
托管模塊:其實CLR拿到了我們的源代碼,然后用對應的編譯器檢查和分析代碼,結果都是托管模塊,不是直接生成程序集的。托管模塊是標准的Windows PE可移值的執行體(PE32文件或32+文件)
托管模塊的組成部分有:PE32頭部分或PE32+頭部分,CLR頭,元數據,IL中間語言代碼。
2.1PE32或PE32+頭部分
這個就是我們平時所說的32位程序,或者還是64位程序,就在這里運行的,相信大家都知道vs編譯器里面有這個(看下圖),其實里面主要就是包含這個東西。其實我們一般的程序選擇的平台都是Any CPU,因為我們平時寫的程序都是只包含類型安全的托管代碼。但是在有些時候,或者要面向一種功能特定的CPU架構的非托管代碼互操作的時候。可能就是需要選擇其他平台了。
2.2 CLR頭
包含使這個模塊成為托管模塊的信息(可以有CLR和一些使用程序進行介紹),說白了這個就是讓我們的CLR能夠認識它。
2.3 元數據
每個托管代碼都包含元數據表,主要有兩種表:一種表描述源代碼中定義類和成員,另一種描述代碼中引用的類型和成員。
2.4 IL中間語言
編譯器編譯源代碼生成的代碼。
(三) 程序集
CLR其實不是和模塊工作的,他是和程序集工作的。編譯器會將默認生成的托管模塊轉換為程序集。啥叫程序集呢:簡單通俗的講,程序集就是把IL代碼和元數據以及一些資源文件,通過C#編譯器,程序集鏈接器組裝而成。生成程序集之后,它有一張清單,告訴我們這個東西有哪些組成。程序集還有一個很重要的地方就是自描述:就是說程序集包含它引用的程序集相關信息,有了這些信息之后呢,CLR可以判斷出程序集的直接依賴對象是什么,不需要在注冊表里面保存額外的信息。就是因為這個特點,所以程序集部署非常容易。