2010-04-14 39 views
26

我在面試中被問及Windows操作系統如何區分常規EXE和.NET EXE。Windows如何區分常規EXE和.NET EXE?

我的回答是,當一個.NET EXE編譯時,編譯器會在頭文件中放入一些信息。信息是PE32或PE32 +。 Windows驗證頭文件以確定是否需要加載加載CLR並執行EXE的MSCOREE.dll。

我的回答正確嗎?

+8

哇,這是一個粗略的面試問題 – brydgesk 2010-04-14 15:53:55

+6

無憐憫的問題;) – 2010-04-14 15:55:45

+6

做採訪的人可能只是讀一本書關於前一天晚上的CLR或IL。 – 2010-04-14 16:18:23

回答

5

儘管我一般同意GregC,但有時候這種類型的信息是有用的。但是,這是一個很難回答的問題可以預料在接受採訪時回答(除非它是爲CLR團隊:)

網頁和博客...

書籍...

+0

如果你是正確的,我不記得我的頭頂...但它聽起來是對的。希望上述鏈接將有所幫助。 – 2010-04-14 16:26:11

+0

我已經通過C#在Jeff Richter的CLR書中讀到過它。這是一段時間以前。我可以依稀記得。我感謝你們所有人發佈你的答案和鏈接。 – AlwaysAProgrammer 2010-04-14 21:17:47

+0

這很傷心,但是你的兩個鏈接在'16 :(' – MaLiN2223 2016-10-29 21:11:12

15

我認爲以下兩個鏈接是理解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中的應用程序。

+0

@Doruk:我想我已經爲你修復了這個鏈接。希望我沒有變得更糟:o) – 2010-04-14 17:57:40

+0

感謝你的修復。那就是訣竅。 – Doruk 2010-04-14 18:43:43

+0

爲了記錄,克里斯的答案是自XP以來更正確。 – argaz 2015-04-09 20:09:59

2

簡單地說,它已經有一段時間等等一些,這可能是有點過時了......

對於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 
+0

雖然誘人的看着一個DLL的導入,看它是否從mscoree進口.dll這不是確定DLL/EXE是否使用.Net的正確方法。你不能依靠被鏈接到mscoree.dll。這對於使用.Net的本地DLL以及僅用於.Net的dll來說是真實的。您還需要查看PE頭特性以確定是否僅使用.Net或混合模式。過去,我們一直在尋找mscoree.dll並根據其存在/缺失情況作出假設。 – 2010-05-12 16:40:38

+0

@Stephen Kellet,我同意。但是我想知道你的評論與發佈的答案有什麼關係?我看「導出」來確認用於引導.NET EXE的入口點的名稱,這並不是要確定任意的DLL是否爲.NET DLL。 – 2010-05-12 16:49:23

+0

它的相關性,因爲有人可以輕鬆跳到結論,如果你正在尋找mscoree.dll那麼這是一個合乎邏輯的事情,也可以在進口表中找到。 – 2010-05-12 17:04:01