CTS,CLS,託管模組,程式集,IL

2021-04-20 09:45:14 字數 3244 閱讀 7482

il可利用所有特性,其他為其子集)

cts規範描述型別的定義和行為。

cts規定乙個型別可以包含

0個或多個成員。(字段,方法,屬性,事件)

還定義了型別可見性和訪問型別成員的一些規則(

private

,family

,assembly等)

cts建立了以程式集為型別可見性邊界的規則,而

clr實現了這種可見性規則。

cts還定義了諸多規則來管理型別繼承,虛函式,物件生存期等事項。

cts定義了型別的行為,故型別的行為是完全相同的,與語言無關的。

cts僅支援單繼承,故不支援

c++的多繼承。

cts規定所有型別都必須繼承自

object

(所有語言必須支援的乙個最小特性集合)

如果希望建立的型別可以被其他語言方便的訪問,只能使用語言中那些對其他語言來說也可用的特性。為了解決這個問題,有了

cls。

cls為編譯器廠商詳細描述了面向

clr的編譯器必須支援的乙個最小特性集合。

cls定義了可以被任何與

cls相容的程式語言訪問到的,外部可見的型別和方法所遵守的規則。

在clr

中型別的每個成員或者是乙個字段,或者是乙個方法。

編譯器對於其他額外抽象(例如事件,委託,構造器,屬性等)在源**中遇到這些構造時將其翻譯成欄位或方法。這樣

clr和其他的程式語言才能訪問它們。

///

clr的特性:執行緒,異常等可用於所有面向

clr的語言。

clr對開發人員使用何種語言(面向

clr的)一無所知。

編譯器可看做是乙個語法檢查器和「正確**」的分析器。無論何種語言,最後都生成結果是乙個託管模組。

clr才執行的標準

pe檔案。

其組成:

1.pe

表頭。包括檔案型別(

gui,

cui或者

dll)還包括時間標記記錄檔案建立時間。對於包含本地

cpu**的模組,該表頭還會有一些本地

cpu**的資訊。(對於僅包含

il**的模組,該

pe表頭會被忽略。)

2.clr

表頭。包括元資料的主版本號和次版本號,一些標記,如果是

gui或

cui則會有入口點方法(

main

方法)的

methoddef

元資料標記,乙個可選的強命名資料標籤等。

3.元資料。一塊二進位制資料。包含一些表。分兩種,一種描述源**中定義的型別和成員(元資料定義表

moduledef

,typedef

,fielddef

,methoddef

,paramdef

,propertydef

,eventdef

),一種描述源**中引用的型別和成員(元資料引用表

assemblyref

,moduleref

,typeref

,memberref)。

4.il

**(又叫託管**)。編譯器在編譯源**時產生的指令。

所有面向

clr的編譯器都需要為託管模組生成完整的元資料。元資料是一些早先的技術如型別庫,介面定義語言(

idl)檔案的乙個超集。但遠比他們完整。不像型別庫和

idl,元資料總是和包含

il**的檔案相關聯。實際上,兩者總是嵌入同乙個

exe/dll

中。因為編譯器總是同時產生元資料和

il**,並把它們同時嵌入託管模組中。

1.省去源**編譯時對頭檔案和庫檔案的需求。

2.幫助實現智慧型感知(

intellisense)。

3.在clr

的**驗證過程中確保僅執行「安全」的操作。

4.進行序列化和反序列化。

5.幫助

gc跟蹤物件的生存期。

c++編譯器允許同時編寫託管和非託管**,並且生成到同乙個模組中。

/

clrassembly

)。程式集是乙個抽象概念。可以是乙個或多個檔案。

1.程式集是乙個或多個託管模組以及一些資源檔案的邏輯組合。 2.

程式集是元件復用,實施安全策略和版本策略的最小單位。

多個託管模組和資源檔案用程式集鏈結器

al.exe

組合到乙個程式集中並產生乙個

pe檔案來表示所有檔案的邏輯組合。該

pe檔案包含清單(

manifest

)的資料塊。

清單中包括:

assemblydef

,名稱,程式集的版本,語言文化,發布者公鑰等;

exportedtypesdef

,公有匯出型別;

filedef

,除清單所在檔案外,程式集包含的其他的

pe檔案和資源檔案;

manifestresourcedef

,每乙個資源的名稱,標記,資源所在的資源檔案等。

assemblyref

,乙個程式集中所有檔案引用的其他程式集都在該表中有乙個對應的條目。

clr總是先載入包含清單元資料表的檔案,然後用清單來獲取程式集中其他檔案。清單為程式集的使用者和其各個部分之間提供了一層間接關聯,也使得程式集實現自描述。

包含清單的程式集有以下特性: 1.

程式集定義了可重用的型別。 2.

程式集標識有乙個版本號。 3.

程式集可以包含與之相關的安全資訊。

程式集允許我們分離它的邏輯表示和物理表示(比如**和資源分開)。

三種情況: 1.

2.按需向程式集新增資源或資料檔案。 3.

可以使我們建立的程式集包含一些不同語言實現的型別。

我們可以直接以組合語言的方式編寫

il彙編器

ilasm.exe

。還有反彙編器

ildasm.exe

il最大好處不是對底層

cpu的抽象,而是大大的提高了應用程式的健壯性。當

il**被編譯成本地

cpu指令時,

clr將執行乙個叫「驗證」的過程。驗證過程可檢查的情景:不能從未初始化的記憶體中讀取資料;每個方法呼叫都必須傳入正確的引數個數,並且各個引數的型別要正確匹配;每個方法的返回值都必須被正確的使用;每個方法都必須有乙個返回值等等。

C 託管模組與程式集

當寫好了c 的源 後,c 編譯器會把源 編譯成乙個託管模組而非最終的機器語言。這個涉及到clr的相關功能,因為clr就是為了將不同的語言編寫 例如c vb 出來的源 可以更好地在不同平台使用,而不是針對某一種架構cpu進行編譯。編譯器編譯出託管模組後,最終通過jit編譯器動態實時編譯託管模組中的il...

PE檔案,程式集,託管模組,元資料

clr實際是和程式集工作,程式集 assembly 是抽象概念 程式集 乙個或多個模組 資源檔案的邏輯性分組,是重用安全性和版本控制的最小單元。編譯器會預設將生成的託管模組生成程式集 程式集既可以是exe,也可以是dll 其中也含有可執行的檔案 元資料是由幾個表構成的二進位制塊,有三種元資料表 定義...

程序,執行緒,應用程式域,程式集,託管

程序 要解決的問題 為了使程式能併發執行,要併發執行就要隔離程序,使程序獨立,即每個程序有屬於自己的資料段 程式段 程序控制塊 託管 託管的 不可以直接寫記憶體,所以是安全的。非託管 非託管的 可以直接讀寫記憶體,不安全,但效率高,像c 中的指標。執行緒 出現的背景 由於程序是乙個資源的擁有者,因而...