2010-05-07 87 views
17

考慮我們有.NET Winforms應用程序或控制檯應用程序。 任何人都可以告訴我什麼將一步一步發生,直到WinForm或控制檯應用程序啓動。我想知道內部結構 - 比如EXE如何與Framework進行通信,CLR的作用是什麼,在啓動應用程序本身時會發生什麼情況。例如:用戶單擊.NET程序集(EXE)時會發生什麼?

+6

作爲stakoverflow的答案?有幾本書的書是關於這些的,長達數百頁;) – TomTom 2010-05-07 11:51:36

+5

@TomTom - 這不太公平!......這些是刪節版本。 – 2010-05-07 11:56:35

+2

1.下載單聲道。 2.編譯它。 3.在調試器下啓動它。 4.單步。 5.重複第4步。 – 2010-05-07 11:58:22

回答

13

當您雙擊點擊一個.NET的.exe程序集:

  • Windows的PE加載器踢
  • 如果你是一個Windows> = Windows XP中,將檢測到可執行文件是可執行的託管,將其轉發給.net通過調用mscoree.dll中的_CoreExeMain(_CoreDllMain,如果你雙擊託管的.dll)。它可以使用程序集配置文件來知道使用哪個運行時。
  • 如果您使用的是Windows XP操作系統,請在Windows XP中,該.exe文件包含一小段原生代碼,該代碼將跳轉到mscoree.dll的_CoreExeMain或_CoreDllMain。
  • 然後,mscoree.dll會初始化.net運行時,具體取決於全局配置,程序集配置文件以及哪些不。
  • 然後,如果它是一個.exe,它將JIT編譯它的入口點方法,並開始執行它。
+0

這太棒了。感謝您的回答Jb Evain! – Sathish 2010-05-07 12:11:13

1

的MSCoreEE.dll(MSCore執行Engine.Dll實例只爲一個一體機) 說,例如,當一個.net組件/ .EXE被雙擊或啓動時,OS將加載窗器會inturn加載PE頭文件(可移植可執行文件)[在win32可執行文件的情況下,PE頭文件將包含引導程序(靜態Main())的地址,它將載入並執行main方法,在.Net中,引導程序將包含將存在於C:\ Windows \ System32 \ mscoree.dll中的MSCoreEE.Dll地址,該地址將被執行並加載.net程序集針對的.Net運行時。機器上可以安裝多個版本的.Net運行時,但是,只有一個mscoreee.dll實例可以加載特定的運行時。

CLR將創建第一APP域本身和加載組件(如果組件沒有在代碼中創建附加的應用程序域)

CLR創建3個應用程序域內部 1.系統的應用程序域 一個。 負責加載共享和默認應用程序域,還將mscorelib.dll加載到共享應用程序域 b。 創建3個異常例子 i。致命的發動機異常 ii。堆棧溢出異常 iii。內存不足異常(非常重要的一點是,當開發人員認爲應用程序可能內存不足並想將異常寫入日誌文件時,CLR會預先創建「內存不足」異常,因此會發生內存不足異常沒有剩餘內存來創建此異常的新實例,因此,CLR預先創建此例外以備將來在應用程序中使用 2.共享應用程序域 a。包含mscorlib.dll b。其他應用程序域使用的其他常用庫 c。但是,開發人員無法將自定義Dll推入共享應用程序域,因爲它不能從CLR外部控制它,CLR託管這些dll並且CLR本身無法控制其由開發人員託管的方式,但可以使用某些COM接口開發人員可以託管CLR慣例 3.默認應用程序域 a。所有用戶的二進制文件的.exe的,Dll在這裏加載

相關問題