2010-04-14 15 views
26

Me preguntaron en una entrevista sobre cómo Windows OS diferencia entre un EXE regular y un EXE .NET.¿Cómo diferencia Windows entre un EXE regular y un exe .NET?

Mi respuesta fue que, cuando se construye un .NET exe, el compilador pone cierta información en el encabezado. La información es PE32 o PE32 +. Windows verifica el encabezado para determinar si necesita cargar MSCOREE.dll que carga el CLR y ejecuta el EXE.

¿Mi respuesta es correcta?

+8

wow, eso es una pregunta de la entrevista áspera – brydgesk

+6

una pregunta sin piedad;) –

+6

La persona que realiza la entrevista, probablemente acaba de leer un libro sobre el CLR o IL la noche anterior. –

Respuesta

5

Aunque estoy de acuerdo con GregC en general, hay momentos en los que este tipo de información es útil. Pero esa es una pregunta difícil de esperar a responder en una entrevista (a menos que sea para el equipo de CLR :)

páginas web y blogs ...

Libros ...

+0

No me recuerdo de la parte superior de mi cabeza si estás en lo cierto ... pero parece correcto. Con suerte, los enlaces de arriba ayudarán. –

+0

Lo había leído en el libro CLR de Jeff Richter a través de C#. Fue hace un tiempo. Solo podía recordar débilmente. Les agradezco a todos ustedes por publicar sus respuestas y los enlaces. – AlwaysAProgrammer

+0

Es triste pero dos de sus enlaces no funcionan en '16 :( – MaLiN2223

15

Creo que los siguientes dos enlaces son un buen recurso para comprender la estructura de archivos PE y el cargador de Windows.

La cita exacta del artículo de marzo de 2002, que creo que responde a su pregunta, es:

El principal objetivo de un ejecutable .NET es obtener la información específica de .NET como metadatos y lenguaje intermedio (IL) en la memoria . Además, a .NET enlaces ejecutables contra MSCOREE.DLL. Esta DLL es el punto de partida para un proceso .NET. Cuando se carga un archivo ejecutable .NET, su punto de entrada suele ser un pequeño fragmento del código . Ese apéndice solo salta a una función exportada en MSCOREE.DLL (_CorExeMain o _CorDllMain). Desde allí, MSCOREE se hace cargo, y comienza a usar los metadatos e IL desde el archivo ejecutable. Esta configuración es similar a la forma en que las aplicaciones Visual Basic (anteriores a .NET) utilizan MSVBVM60.DLL.

+0

@Doruk: Creo que obtuve ese enlace arreglado para usted. Afortunadamente no lo empeoré: o) –

+0

Gracias por la corrección. Eso hizo el truco. – Doruk

+0

Para el registro, la respuesta de Chris es la más correcta desde XP. – argaz

2

En breve, y lo ha sido desde hace tiempo por lo que algunos de esto podría ser un poco anticuado ...

Para XP y después, el cargador del sistema operativo se ha mejorado para detectar ensamblados administrados sobre la base de un directorio PE entrada, si la entrada del directorio está presente, el cargador carga automáticamente el mscoree.dll y se realiza un salto a una función en mscoree, _CorExeMain (2) para ejecutables y _CorDllMain para dlls. _CorExeMain es entonces responsable de cargar el CLR y poner en marcha la ejecución del código administrado.

que utilizó la siguiente recordarme a mí mismo de los nombres de los puntos de entrada ...

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

Si bien es tentador mirar las importaciones de una DLL para ver si importa desde mscoree .dll esta no es la forma correcta de determinar si un DLL/EXE usa .Net. No puede confiar en estar vinculado a mscoree.dll. Eso será cierto para una DLL nativa que use .Net así como también para una DLL .Net solamente. También debe mirar las características del encabezado PE para saber con certeza si solo está en .Net o modo mixto. Hemos sido atrapados en el pasado al buscar solo mscoree.dll y hacer suposiciones basadas en su presencia/ausencia. –

+0

@Stephen Kellet, estoy de acuerdo. Pero me pregunto qué tiene que ver tu comentario con la respuesta publicada. Miro las "exportaciones" para confirmar el nombre del punto de entrada utilizado para arrancar la correa de un exe .NET, esto no es para determinar si una dll arbitraria es una dll .NET. –

+0

Es relevante porque alguien podría saltar fácilmente a la conclusión de que si está buscando mscoree.dll, entonces es lógico encontrarlo también en la tabla de importaciones. –

Cuestiones relacionadas