託管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程式的路徑 然後再用...