clr 元資料

2022-01-13 17:08:26 字數 2681 閱讀 3630

clr相關編譯器編譯生成的託管模組由四部分組成:pe32或32+頭、clr頭、元資料、il**。

元資料和il**完全對應,保持一致(:>)性。

元資料有很多用途

vs的智慧型感知,自動補全;

**驗證保證型別安全;

序列化、反序列化;

垃圾**(從元資料得知哪些根引用了物件)。

元資料報含兩類表,一種描述源**中定義的型別和成員;另一種描述**引用的型別和成員。模組內部的一些元資料表的大小和偏移量在clr頭中會有包含。

元資料是由幾個表構成的二進位制資料塊。有三種表:定義表、引用表、清單表。

常用元資料定義表(定義於模組中的):

moduledef : 乙個記錄項。包含模組名、副檔名和模組版本id(編譯器建立的guid);

typedef : 每個型別乙個記錄項。包含型別名稱、基型別、一些標誌(public,private等)以及一些索引(指向methoddef表中該型別的方法、fielddef表中該型別的字段、propertydef表中該型別的屬性以及eventdef表中該型別的事件);

methoddef : 每個方法乙個記錄項。包含方法的名稱、一些標誌(private,public,virtual,abstract,static,final等)、簽名以及方法的il**在模組中的偏移量。每個記錄項還引用了paramdef表中的記錄項;

fielddef : 每個字段乙個記錄項。包含標誌(public,private等)、型別和名稱;

paramdef : 每個引數乙個記錄項。包含標誌(in,out,retval等)、型別和名稱;

propertydef : 每個屬性乙個記錄項。包含標誌、型別和名稱。

eventdef : 每個事件乙個記錄項。包含標誌和名稱。

moduledef  -----------> typedef -----------------> |  methoddef -----------------> paramdef

|  fielddef

|  propertydef

|  eventdef

常用引用源資料表

assemblyref : 引用的每乙個程式集有乙個記錄項。包含繫結該程式集所需的資訊:程式集名稱、版本號、語言文化以及公鑰token(根據發布者的公鑰生成的乙個小的雜湊值,標識了所引用程式集的發布者)。另外還包含了一些標誌以及乙個被clr忽略的但可以用於程式集的二進位制資料的校驗和的雜湊值。

moduleref : 引用型別的實現的每個pe模組有乙個記錄項。包含模組名和副檔名。

typeref : 每個引用的型別有乙個記錄項。包含型別的名稱和引用(指向型別的位置)。如果型別在另乙個型別中實現,引用指向乙個typeref記錄項。如果型別在同一模組中實現,引用指向乙個moduledef記錄項。如果型別在呼叫程式集內的另乙個模組中實現,引用指向乙個moduleref記錄項。如果型別在不同的程式集中實現,引用指向乙個assembly記錄項;

memberref : 引用的每個成員(字段、方法、屬性方法和事件方法)有乙個記錄項。包含成員的名稱和簽名,並指向對成員進行定義的型別的typeref記錄項。

memberref------------->typeref-----------------> | typeref        (在另乙個型別中實現)        *****=>moduledef 或 moduleref 或 assembly 

| moduledef  (在同一模組)

| moduleref    (在同程式集的不同模組)

| assembly     (在不同程式集)

除此之外還有很多定義表和引用表。

清單表中主要包含作為程式集組成部分的那些檔案的名稱。此外,還描述了程式集的版本、語言文化、發布者、公開匯出的型別以及構成程式集的所有檔案。

clr總是首先載入包含「清單」元資料表的檔案,再根據「清單」來獲取程式集中的其他檔案。清單包含在pe檔案中。

清單元資料表(程式集的):

assemblydef : 如果模組標識的是程式集,就包含單一記錄項來列出程式集名稱、版本、語言文化、一些標誌、雜湊演算法以及發布者公鑰(可為null);

filedef : 每個pe檔案和資源檔案都有乙個記錄項(清單本身所在檔案除外,該檔案在assemblydef的單一記錄項中列出)。包含檔名、副檔名、雜湊值和一些標誌。如果程式集只包含自己的檔案,則該錶無記錄(vs中不能建立多檔案程式集,只能通過命令列);

manifestresourcedef : 每個資源檔案乙個記錄項。包含資源名稱、一些標誌(是否外部可見:public,private)以及filedef表的乙個索引(指出包含在哪個檔案中)。如果資源不是獨立檔案,那麼資源是包含在pe檔案中的流。嵌入資源,記錄項會包含乙個偏移量,指出資源流在pe檔案中的起始位置;

exportedtypesdef : pe模組中匯出的每個public型別有乙個記錄項。包含型別名稱、filedef表的乙個索引(指出型別由程式集的哪個檔案實現)以及typedef表的乙個索引。

assemblydef --------------------> filedef <-----------------------------> manifestresourcedef

exportedtypesdef ------------> filedef + typedef

重溫CLR(一)CLR基礎

如果乙個c developer,對clr沒有了解,那就只能是入門級別。未來.net core是趨勢,但是.net core 也是基於coreclr的,而clr和coreclr其實差別不大,從runtime那部分看幾乎沒有區別,程序管理,gc,jit這些基本上是一樣的。clr vie c 這本書很久之...

Clr靜態資料Table Valued函式

前兩天insus.net實現乙個功能 在資料庫中提供唯讀資料 在資料庫中為程式提供靜態資料。它是在clr儲存過程實現。現想使用另外一種方式來解決。如果提供這些靜態數需要與其它資料結合join等,這樣象前面的儲存過程,有些不太好操作。那我們可以把它實現在table valued function。建立...

Clr靜態資料Table Valued函式

前兩天insus.net實現乙個功能 在資料庫中提供唯讀資料 在資料庫中為程式提供靜態資料。它是在clr儲存過程實現。現想使用另外一種方式來解決。如果提供這些靜態數需要與其它資料結合join等,這樣象前面的儲存過程,有些不太好操作。那我們可以把它實現在table valued function。建立...