CLR寄宿 中 託管exe檔案的載入和執行

2022-02-04 21:29:24 字數 2152 閱讀 5248

託管exe

檔案的載入和執行過程在之前的文章

做過簡要的介紹,現在結合本章的內容進行詳細的分析。

託管exe

檔案被啟動的時候,首先被

pe loader

載入。pe loader

載入exe

檔案之後,會分析

pe檔案頭的

data directory table

,如果clr

_header

內的值不為

0,表示該檔案是託管

pe檔案,

pe loader

會立即載入

mscoree.dll

,並且執行

mscoree.dll

內的_corexemain()

函式。如果是

windows

xp以前版本的作業系統(比如

windows

2000

),當windows

2000

的loader

將exe

檔案載入之後,會檢查

pe header

的data directory table

,將import table

所記錄的資料都載入記憶體,就是

mscoree.dll

。接著找出

pe header

內程式的入口點,並執行此處的**。這是

x86

機器碼,由編譯器自動產生,只有一道指令

(6 bytes)

,為「ff 25 00 20 40 00」

,翻譯成

x86組合語言就是「

jmp dword ptr [402000]

」,其中

0x00400000

是exe

檔案的image base

,而0x2000

是import address table

的rva (

此處是_corexemain()

的偏移位址

),所以執行「

jmp dword ptr [402000]

」的結果會跳到

mscoree.dll

的_corexemain()

。在執行

_corexemain()

之後,其中的**首先判斷需要載入的

clr版本。

clr啟動之後,接下來要做的就是初始化工作,為託管程式建立程序,申請記憶體空間,建立執行緒池和應用程式域。第乙個建立的應用程式域被稱為

。初始化之後,要載入

mscorlib.dll

元件和其中的模組。

模組載入之後,會呼叫

class loader

來載入mscorlib

內相關的

class

。載入的

class

順序依次為:

1)system.object

2)system.icloneable

3)system.collections.ienumerable

4)……

5)6)

system.loaderoptimization

7)system.runtime.remoting.proxies.__transparentproxy

注意 此時並未載入

mscorlib

內全部的

class

,只載入目前需要的

class。載入

class

之後,clr

會生成主線程,生成主線程又需要載入以下的類:

system.threading.monitor

system.char

system.runtime.interopservices.runtimeenvironment

system.runtimefieldhandle

system.runtime.compilerservices.runtimehelpers

system.environment

主線程生成之後就是載入應用程式的元件到應用程式域,之後才真正進入應用程式的主函式。

進入main()

函式之後,會呼叫

jit編譯器將

il**編譯成本地**執行。

CLR寄宿 中 託管exe檔案的載入和執行

託管exe 檔案的載入和執行過程在之前的文章 做過簡要的介紹,現在結合本章的內容進行詳細的分析。託管exe檔案被啟動的時候,首先被 pe loader 載入。pe loader 載入exe 檔案之後,會分析 pe檔案頭的 data directory table 如果clr header 內的值不為...

C中的dll lib和exe檔案

參考 鏈結1 鏈結2 動態鏈結庫 dynamic link library,縮寫為dll 執行時載入 是乙個可以被其它應用程式共享的程式模組,其中封裝了一些可以被共享的例程和資源。動態鏈結庫檔案的副檔名一般是dll,也有可能是drv sys和fon,它和可執行檔案 exe 非常類似 dll中雖然包含...

VC中獲取exe檔案的相對路徑

最近的學習中需在相關方面的知識,就google了一下這方面的資料,也稍稍總結一下!具體 如下 char fullpath 255 char ptoken null getmodulefilename null,fullpath,sizeof fullpath 1 得到生成.exe程式的路徑 然後再用...