內容提要
本章的目的是對.Net 框架的設計作一個整體的介紹,包括介紹框架中使用的一些技術、定義一些術語。同時會展現從源代碼生成應用程序(或者一些包含了一些自定義類型的能夠發佈的組件),而且會解釋程序的運行機制。 編程
包含如下子標題: windows
- 將源代碼編譯成託管的模塊(Managed Modules)
- 將Managed Modules 組合成 Assemblie
- 加載 CLR
- 執行 Assembly 代碼
- Native code 生成工具:NGen.exe
- .NET 框架類庫 (Framework Class Library, FCL)
- The Common Type System (CTS)
- The Common Language Specification (CTS)
- 與非託管代碼的互操做性
將源代碼編譯成託管模塊(Managed Modules)
CLR是能夠被不一樣的編程語言共同使用的運行時環境。實際上,在運行時,CLR並不知道程序是使用什麼語言寫的,由於這些語言都被預先編譯成了Managed Module (IL 和 元數據)。不一樣語言的編譯器,能夠認爲是不一樣的代碼檢查器,檢查代碼的語法是否正確,描述的操做是否合理等。 安全
本地代碼產生針對CPU的代碼,而C#、F#等語言產生的是針對CLR的代碼。 框架
除了產生IL代碼以外,全部針對CLR的編譯器還會在每一個託管模塊中生成"元數據"(metadata)。簡要來講,Metadata是用來描述module中定義了什麼東西(例如類型以及類型的成員)的一組數據表。另外,Metadata還描述了Module中引用了哪些東西(好比外部載入的類型以及類型的成員) 編程語言
PE32 or PE32+ header工具 |
- 若是模塊中含有native code,則會有 PE32(+) 信息,不然(即只包含託管代碼)這部分會被忽略掉
- PE32 for 32bit windows ,while PE32+ for 64bit
- indicates the type of file : GUI/CUI/DLL
- contains a time stamp indicating when the file was built
|
CLR headerui |
- 包含使得該託管模塊因此爲託管模塊的信息
- 指定所須要的CLR 的版本、一些flags
- the MethodDef metadata token of the managed module's entry point method
- 模塊中元數據、資源、strong name 、some flags 等的位置和大小
|
元數據(Metadata)設計 |
- 全部託管模塊都包含元數據表,共分兩類:
- 描述代碼中定義的類型和成員的表
- 源代碼中引用了的類型和成員的表
|
IL代碼code |
- 源代碼編譯以後生成的代碼
- CLR負責在運行時將其編譯成本地cpu指令
|
Metadata有不少用途,例如: 對象
- 有了Metadata就不須要像C/C++頭文件以及庫文件的東西了,由於Metadata將引用模塊所須要的信息存儲在模塊自身當中了,編譯器能夠從模塊中之間提取這部分信息;
- Visual Studio中的智能輸入提示也是經過處理Metadata中所包含的信息來幫助寫代碼的;
- CLR的代碼驗證過程使用Metadata來確保只進行了類型安全的操做;
- 實現序列化
- 是的垃圾回收器能夠肯定對象的生命週期,對任意對象,gc能夠經過metadata知道這個對象的類型以及這個對象引用了哪些其餘對象;
C#/F#/ILAsm 都是產生託管的代碼和託管的類型。而Microsoft C++則默認產生native code,可是能夠經過/clr 使其產生託管的module。Microsoft C++仍是惟一一個能夠容許開發這既使用託管代碼又使用非託管代碼而且將兩者注入到同一個module中的編譯器,因此常被利用來在託管項目中調用已有的非託管代碼。
將Managed Modules 組合成 Assemblie
加載 CLR
執行 Assembly 代碼
Native code 生成工具:NGen.exe
.NET 框架類庫 (Framework Class Library, FCL)
The Common Type System (CTS)
The Common Language Specification (CTS)
與非託管代碼的互操做性