国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

01.由淺入深學(xué)習(xí).NET CLR 基礎(chǔ)系列之CLR 的執(zhí)行模型

2019-11-17 02:46:43
字體:
供稿:網(wǎng)友

01.由淺入深學(xué)習(xí).NET CLR 基礎(chǔ)系列之CLR 的執(zhí)行模型

.Net 從代碼生成到執(zhí)行,這中間的一些列過程是一個有別于其他的新技術(shù)新概念,那么這是一個什么樣的過程呢,有什么樣的機制呢,清楚了這些基本的東西我們做.Net的東西方可心中有數(shù)。那么,CLR的執(zhí)行模型是一個什么樣的過程呢?

將源代碼編譯成托管模塊 --> 將托管模塊合并成程序集 --> 加載公共語言運行時 --> 執(zhí)行程序集的代碼

目錄
  • 將源代碼編譯成托管模塊
  • 將托管模塊合并成程序集
  • 加載公共語言運行時
  • 執(zhí)行程序集的代碼
  • 本地代碼生成器:NGen.exe
  • Framwork類庫入門
  • 通用類型系統(tǒng)
  • 公共語言規(guī)范(CLS)
  • 與非托管代碼的互操作性

將源代碼編譯成托管模塊

首先.Net開發(fā)是支持多語言選擇或者混合語言編程的,代碼的編譯是采用編譯器面向CLR的機制,即,無論何種語言編寫的代碼,只要采用的編譯器是面向CLR的就可以了。

Common Language Runtime:公共語言運行時,可由多種編程語言使用的"運行時"。CLR的核心功能(比如內(nèi)存管理,程序集加載,安全性,異常處理和線程同步)可由面向CLR的所有語言使用。

Managed module:托管模塊,即編譯器編譯的結(jié)果都是一個托管模塊。

IL:每個面向CLR的編譯器生成的都是IL(中間語言)代碼。也成為托管代碼,因為CLR要管理它的執(zhí)行。

Native code compiler:本地代碼編譯器。生成的是面向特定CPU架構(gòu)(X86、X64、IA64)的代碼。

Metadata:元數(shù)據(jù)。是一種數(shù)據(jù)表,其中一些數(shù)據(jù)描述了模塊中定義的內(nèi)容,比如類型和成員;還有些數(shù)據(jù)描述了模塊引用的內(nèi)容,比如導(dǎo)入的類型及其成員。元數(shù)據(jù)總是和包含IL代碼的文件關(guān)聯(lián),永遠是同步的。

將托管模塊合并成程序集

上圖顯示了托管模塊合并成程序集的過程。

程序集(assembly)的理解:一個或者多個模塊/資源文件的邏輯性分組;程序集是重用、安全性、版本控制的最小單元。

從上圖顯示可看出程序集(assembly)包含一個名為"清單"(manifest)的數(shù)據(jù)塊,它是由元數(shù)據(jù)表構(gòu)成的另一種集合,描述了構(gòu)成程序集的文件。

另一個地方就是AL.exe:程序集連接器

加載公共語言運行時

Windows 檢查EXE文件頭:

PE32:需要32位地址空間,可在32位/64位地址空間中運行

PE32+:需要64位地址空間

CPU架構(gòu)信息,確保當前CPU是符合要求的

創(chuàng)建32/64/WoW64位進程 :根據(jù)exe文件頭創(chuàng)建的

加載MSCorEE.dll: 該文件在C:/Windows/SysWow64 或 C:/Windwos/Sys

看上面的流程還是比較清晰的。

執(zhí)行程序集的代碼

為了執(zhí)行一個方法,首先必須把它的IL轉(zhuǎn)換成本地的CPU指令。這是CLR的JIT(just-in-time或者"即時")編譯器的職責(zé)。從示意圖來分析其過程是如何的。

  1. Mian()執(zhí)行之前,CLR先檢測出Main的代碼所引用的所有類型.
  2. 分配內(nèi)部數(shù)據(jù)結(jié)構(gòu),用于管理所引用類型的訪問,如圖Console類型,Console類型定義的每一個方法都有一個對應(yīng)的entry(記錄項)。每個entry都容納了一個地址,根據(jù)此地址即可找到方法的實現(xiàn).對這個結(jié)構(gòu)進行初始化時,CLR將每個記錄項都設(shè)置成(指向)包含在CLR內(nèi)部的一個未文檔化的函數(shù),這個函數(shù)即為JITCompiler
  3. Main函數(shù)首次調(diào)用WriteLine時,JITCompiler函數(shù)會被調(diào)用。

    JITCompiler 函數(shù)調(diào)用時,JITCompiler在定義該類型的程序集的元數(shù)據(jù)中查找被調(diào)用方法的IL

    -->驗證IL

    -->編譯成本地CPU指令

    -->返回到剛才的記錄,并修改對JITCompiler的引用,指向剛才編譯的內(nèi)存塊的地址

    -->JITCompiler函數(shù)跳轉(zhuǎn)到剛才的內(nèi)存塊執(zhí)行

    -->返回到Mian繼續(xù)執(zhí)行

  4. Main函數(shù)第二次調(diào)用WriteLine時

本地代碼生成器:NGen.exe

NGen.exe:.NET Framework 提供的工具,可以在一個應(yīng)用程序安裝到目標計算機上時,將IL代碼編譯成本地代碼。

NGen.exe終于作用:

  1. 加快應(yīng)用程序的啟動速度
  2. 減少應(yīng)用程序的工作集(working Set)

位置:類似C:/Windows/Microsoft.NET/Framework/v4.0.30319

命令語法:

ngen <action> [options]

ngen /? | /help

Framework類庫

FCL:Framework Class Library 是一組DLL程序集的統(tǒng)稱。

通用類型系統(tǒng)

CTS:Common Type System,它描述了類型的定義和行為。

公共語言規(guī)范

CLS:Common Language Specification

相信混合語言的編程才迫使微軟制定了CLS。CLS解決的問題是使用不同的語言創(chuàng)建的對象能夠相互通信。要創(chuàng)建很容易從其他語言中訪問的類型,只能從自己的編程語言中挑選其他語言都確定支持的那些功能。

這就要求任何編譯器生成的類型要想兼容于由其他"符合CLS、面向CLR的語言"所生成的組件,就必須支持這個最小功能集。

告訴編譯器需要檢查CLS兼容性的語法

[assembly:CLSCompliant(true)]

namespace SomeLibrary

{

}

與非托管代碼的互操作性

為了迎合之前的非托管代碼的用戶,微軟通過CLR提供了一些機制,允許應(yīng)用程序中同時包含托管和非托管代碼。

  1. 托管代碼能調(diào)用DLL中的非托管函數(shù)
  2. 托管代碼可使用現(xiàn)有的COM組件(服務(wù)器)
  3. 非托管代碼可使用托管類型(服務(wù)器)

本文還是主要學(xué)習(xí)了一些.NET平臺設(shè)計的一些架構(gòu)思想和概念,應(yīng)該在整體上對.NET有一個基本的認識。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 集贤县| 治县。| 山阳县| 新巴尔虎右旗| 沾益县| 平湖市| 青冈县| 巴塘县| 青铜峡市| 济南市| 贵溪市| 莫力| 西乌珠穆沁旗| 横山县| 济源市| 深圳市| 连云港市| 阳新县| 元阳县| 九江市| 南皮县| 门源| 建瓯市| 时尚| 兴安县| 榆中县| 福贡县| 邛崃市| 永仁县| 眉山市| 钟山县| 惠东县| 彰武县| 汶川县| 青田县| 自治县| 庄浪县| 锡林郭勒盟| 礼泉县| 区。| 桑日县|