我在面試中被問及Windows操作系統如何區分常規EXE和.NET EXE。Windows如何區分常規EXE和.NET EXE?
我的回答是,當一個.NET EXE編譯時,編譯器會在頭文件中放入一些信息。信息是PE32或PE32 +。 Windows驗證頭文件以確定是否需要加載加載CLR並執行EXE的MSCOREE.dll。
我的回答正確嗎?
我在面試中被問及Windows操作系統如何區分常規EXE和.NET EXE。Windows如何區分常規EXE和.NET EXE?
我的回答是,當一個.NET EXE編譯時,編譯器會在頭文件中放入一些信息。信息是PE32或PE32 +。 Windows驗證頭文件以確定是否需要加載加載CLR並執行EXE的MSCOREE.dll。
我的回答正確嗎?
儘管我一般同意GregC,但有時候這種類型的信息是有用的。但是,這是一個很難回答的問題可以預料在接受採訪時回答(除非它是爲CLR團隊:)
網頁和博客...
書籍...
如果你是正確的,我不記得我的頭頂...但它聽起來是對的。希望上述鏈接將有所幫助。 – 2010-04-14 16:26:11
我已經通過C#在Jeff Richter的CLR書中讀到過它。這是一段時間以前。我可以依稀記得。我感謝你們所有人發佈你的答案和鏈接。 – AlwaysAProgrammer 2010-04-14 21:17:47
這很傷心,但是你的兩個鏈接在'16 :(' – MaLiN2223 2016-10-29 21:11:12
我認爲以下兩個鏈接是理解PE文件結構和Windows加載程序的好資源。
從2002年3月的文章,我相信確切的報價回答你的問題,就是:
.NET 可執行文件的主要用途是獲取.NET特定的 信息,如元數據和 中間語言(IL)轉換爲 內存。此外,一個.NET 可執行文件鏈接針對 MSCOREE.DLL。這個DLL是.NET進程的起點。 當一個.NET可執行文件加載時,其入口點通常是一個很小的代碼段 。該存根僅跳轉到一個 導出的函數在MSCOREE.DLL (_CorExeMain或_CorDllMain)。從 那裏,MSCOREE負責,並且 開始使用元數據和IL從 的可執行文件。此設置爲 類似於使用Visual Basic Basic(.NET之前)中的應用程序 MSVBVM60.DLL中的應用程序。
簡單地說,它已經有一段時間等等一些,這可能是有點過時了......
對於XP及更高版本,操作系統加載器基於增強的PE上的目錄,以檢測管理組件條目,如果目錄條目存在,加載器自動加載mscoree。dll和mscoree中的函數跳轉,_CorExeMain(2)爲可執行文件,_CorDllMain爲dll。 _CorExeMain然後負責加載CLR並啓動託管代碼的執行。
我用下面的提醒入口點名稱的自己...
C:\Windows\System32>dumpbin -exports mscoree.dll
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file mscoree.dll
File Type: DLL
Section contains the following exports for mscoree.dll
00000000 characteristics
4AF3AF84 time date stamp Fri Nov 06 07:09:24 2009
0.00 version
17 ordinal base
126 number of functions
123 number of names
ordinal hint RVA name
38 0 0001AAA0 CLRCreateInstance
... Lots of stuff left out...
136 76 00015030 _CorDllMain
138 77 00004DDB _CorExeMain
137 78 0001A981 _CorExeMain2
139 79 0002033B _CorImageUnloading
140 7A 000042D0 _CorValidateImage
24 00008017 [NONAME]
142 00014C4D [NONAME]
Summary
4000 .data
4000 .reloc
1000 .rsrc
40000 .text
雖然誘人的看着一個DLL的導入,看它是否從mscoree進口.dll這不是確定DLL/EXE是否使用.Net的正確方法。你不能依靠被鏈接到mscoree.dll。這對於使用.Net的本地DLL以及僅用於.Net的dll來說是真實的。您還需要查看PE頭特性以確定是否僅使用.Net或混合模式。過去,我們一直在尋找mscoree.dll並根據其存在/缺失情況作出假設。 – 2010-05-12 16:40:38
@Stephen Kellet,我同意。但是我想知道你的評論與發佈的答案有什麼關係?我看「導出」來確認用於引導.NET EXE的入口點的名稱,這並不是要確定任意的DLL是否爲.NET DLL。 – 2010-05-12 16:49:23
它的相關性,因爲有人可以輕鬆跳到結論,如果你正在尋找mscoree.dll那麼這是一個合乎邏輯的事情,也可以在進口表中找到。 – 2010-05-12 17:04:01
哇,這是一個粗略的面試問題 – brydgesk 2010-04-14 15:53:55
無憐憫的問題;) – 2010-04-14 15:55:45
做採訪的人可能只是讀一本書關於前一天晚上的CLR或IL。 – 2010-04-14 16:18:23