CLR和Windows載入器

2022-02-11 22:58:32 字數 980 閱讀 2383

在windows上執行的應用程式可以通過多種不同的方式來啟動。windows負責處理所有的相關工作,包括設定程序位址空間、載入可執行程式, 以及指示處理器開始執行等。當處理器開始執行程式指令時,它將一直執行下去,直到程序退出。在本章的前面已經討論過,在.net應用程式中並不包含機器指 令。因此,在處理器開始執行前,首先需要將中間語言轉換為機器指令。儘管存在著這種差異,.net應用程式仍然可以採取與非託管應用程式一樣的啟動方式。 為什麼這種方式可行?windows載入器是否知道.net應用程式的一些特定資訊,因此能夠自動地啟動clr?答案在於windows上一種由來已久的 檔案格式:可移植的可執行檔案格式(portable executable,pe)。在圖2-3中給出了pe映像檔案的一般結構。

為了支援pe映像的執行,在pe的頭部包含了乙個域叫做addressofentrypoint。這個域表示pe檔案的入口點(entry point)位置。在.net程式集中,這個值指向.text段中的一小段存根(stub)**。下乙個重要的域就是資料目錄(data directory)。當.net編譯器生成程式集時,它會在pe檔案中增加乙個資料目錄項。具體來說,這個資料目錄項的索引為15,其中包含了clr頭 的位置和大小。然後,根據這個位置在pe檔案中找到位於.text段中的clr頭。在clr頭中包含了乙個結構image_cor20_header。在 這個結構中包含了許多資訊,例如託管**應用程式的入口點,目標clr的主版本號和從版本號,以及程式集的強名稱簽名(strong name signature)等。根據這個資料結構中包含的資訊,windows可以知道要載入哪個版本的clr以及關於程式集本身的一些最基本資訊。 在.text段中還包含了程式集的元資料表,msil以及非託管啟動存根**。非託管啟動存根**包含了由windows載入器執行以啟動pe檔案執行的 **。

在接下來的章節中,我們將看到windows載入器如何載入非託管映像和.net程式集。

CLR載入器(一)使用載入器的方式

載入器往往是隱式地為你工作。程式設計師能夠通過程式集載入器顯式地與載入器進行互動。程式集載入器通 過system.reflection.assembly類的loadfrom靜態方法向程式設計師公開。這個方法接收乙個字串,它可以 是檔案系統路徑,也可以是識別含有程式集清單模組的統一資源定位器。下面 載...

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

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

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

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