2010-04-14 10 views
26

In un'intervista mi è stato chiesto come si differenzia Windows tra un normale EXE e un EXE .NET.In che modo Windows distingue tra un EXE normale e un exe .NET?

La mia risposta è stata, quando un exe .NET è compilato, il compilatore inserisce alcune informazioni nell'intestazione. Le informazioni sono PE32 o PE32 +. Windows verifica l'intestazione per determinare se è necessario caricare MSCOREE.dll che carica il CLR ed esegue l'EXE.

La mia risposta è corretta?

+8

wow, questa è una questione intervista ruvida – brydgesk

+6

un dubbio pietà;) –

+6

La persona che fa l'intervista probabilmente solo leggere un libro circa il CLR o IL la sera prima. –

risposta

5

Mentre sono d'accordo con GregC in generale ci sono momenti in cui questo tipo di informazioni è utile. Ma questa è una domanda difficile da prevedere per rispondere in un'intervista (a meno che sia per il team CLR :)

pagine web e blog ...

Libri ...

+0

Non ricordo la parte superiore della mia testa se hai ragione ... ma suona bene. Speriamo che i link sopra aiuteranno. –

+0

Ne avevo letto nel libro di Jeff Richter CLR via C#. È stato un po 'di tempo fa. Potrei solo ricordare debolmente. Ringrazio tutti voi per aver postato le vostre risposte e i collegamenti. – AlwaysAProgrammer

+0

È triste ma due dei link non funzionano in '16 :( – MaLiN2223

15

Penso che i seguenti due collegamenti siano una buona risorsa per comprendere la struttura del file PE e il caricatore di Windows.

la citazione esatta dall'articolo marzo 2002 che a mio avviso risponde alla tua domanda, è:

Lo scopo principale di un file eseguibile .NET è quello di ottenere le informazioni specifiche di .NET come metadati e lingua intermedia (IL) nella memoria . Inoltre, a .NET collegamenti eseguibili contro MSCOREE.DLL. Questa DLL è il punto di partenza per un processo .NET. Quando un eseguibile .NET viene caricato, il suo punto di ingresso è in genere un piccolo stub del codice . Lo stub salta semplicemente a una funzione esportata in MSCOREE.DLL (_CorExeMain o _CorDllMain). Da lì, MSCOREE prende il comando e inizia a utilizzare i metadati e IL da il file eseguibile. Questa impostazione è simile al modo in cui le app in Visual Basic (precedente a .NET) utilizzate MSVBVM60.DLL.

+0

@Doruk: Penso di aver risolto il problema per te. Spero di non aver peggiorato la situazione: o) –

+0

Grazie per la correzione. Questo ha fatto il trucco. – Doruk

+0

Per la cronaca, la risposta di Chris è la più corretta da XP. – argaz

2

In breve, ed è stato un po 'così un po' di questo potrebbe essere un po 'datato ...

Per XP e versioni successive, il loader del sistema operativo è stata migliorata per rilevare assembly gestiti sulla base di una directory PE voce, se è presente la voce della directory, il caricatore carica automaticamente il file mscoree.dll e un salto sono fatti per una funzione in mscoree, _CorExeMain (2) per eseguibili e _CorDllMain per dlls. _CorExeMain è quindi responsabile del caricamento del CLR e del kickstart dell'esecuzione del codice gestito.

ho usato il seguente per ricordare a me stesso dei nomi dei punti di ingresso ...

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

Mentre sei tentato di guardare le importazioni di una DLL per vedere se importa da mscoree .dll questo non è il modo giusto per determinare se una DLL/EXE usa .Net. Non puoi fare affidamento su essere collegato a mscoree.dll. Questo sarà vero per una DLL nativa che usa .Net e per una sola DLL .Net. È necessario anche esaminare le caratteristiche dell'intestazione PE per sapere con certezza se. Solo o mista. Siamo stati scoperti in passato cercando solo mscoree.dll e facendo ipotesi basate sulla sua presenza/assenza. –

+0

@Stephen Kellet, sono d'accordo. Ma mi chiedo che cosa il tuo commento ha a che fare con la risposta postata? Guardo le "esportazioni" per confermare il nome del punto di ingresso utilizzato per avviare il braccialetto su un exe .NET, questo non è per determinare se una dll arbitraria è una dll .NET. –

+0

È importante perché qualcuno potrebbe facilmente saltare alla conclusione che se stai cercando mscoree.dll, allora questa è una cosa logica da trovare anche nella tabella delle importazioni. –

Problemi correlati