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。建立...