精品賞析:一個.NET程式在編譯和運行時都做了些什嗎?

來源:互聯網
上載者:User
編譯|程式 一個.NET程式在編譯和運行時都做了些什嗎?
================================================================
在新聞群組和郵件清單裡有大量關於一個.Net程式的設計編譯(design-time or
run-time)和運行原理 (CPU-specific binary or pseudo-code)的疑問。

這裡是一個簡單的回答:當你編譯一個C#應用程式或任何一種CLS(Commmon
Language Specification)相容的語言時,它將首先被編譯成一種稱為IL
(Intermediate Language)的虛擬碼(pseudo-code)。在這個應用程式第一次
被啟動並執行時候,這種IL代碼將被編譯成機器代碼,用於執行。也就是說從原始碼
到得到運行結果,進行了兩次編譯。事實上,只有那些被真正使用的函數代碼
才會被進行第二次編譯。下面揭示開發過程中被隱藏起來的細節:

1) 你用C#開發一些程式
2) 用C#編譯器或CLS相容的編譯器編譯成EXE
3) 編譯器將產生的IL代碼和附加資訊(manifest)放入擁有一個標準PE頭的Win32
可執行檔的唯讀部分。
4) 編譯器在建立這個可執行檔時匯入(import)一個名為_CorExeMain的函數。
這個函數是.NET EE(execution engine)--.NET運行期引擎的入口函數。
5) 當執行這個Win32可執行檔時,因為其主要是依賴於DLL的PE檔案,操作系
統將會調用位於MSCorEE.DLL中的_CorExeMain函數。
6) 作業系統通過PE檔案裡的進入點,調用MSCorEE.DLL。並能保證在Windows裡
可以有很多程式同時運行。
7) 因為作業系統不能執行.NET IL代碼,EXE裡的進入點只是簡單的中介,它將
指示作業系統調用_CorExeMain函數。
8) 隨後_CorExeMain函數開始解釋位於PE檔案中的IL代碼。
9) 因為IL是不能被直接執行的, .NET EE使用稱為JITter (Just In Time compiler)
的即時編譯器將IL代碼編譯成本地CPU機器代碼用於執行。這一即時編譯過程
只在第一次執行的時候進行。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。