2008-10-29 8 views
5

Disculpa si algo de lo que voy a decir no tiene sentido o pasa por alto algo obvio: mi conocimiento de los componentes internos de CLR es irregular.x64 .NET compilation/Process Explorer rareza

Si entiendo correctamente, entonces si solo construyo una solución para 'AnyCPU' en VS2K5 (o apunte MSBuild en ese archivo .sln con esa configuración), entonces los binarios solo compilarán hasta MSIL. Luego se JITted a 32 bits si se ejecuta en una plataforma de 32 bits o código de 64 bits si se ejecuta en x64 ... ¿verdad?

Los archivos DLL se utilizan para una aplicación web y se alojan en el proceso W3WP.exe. Process Explorer me dice que W3WP es un proceso de 64 bits.

Pero cuando uso Process Explorer para verificar las propiedades en una de estas DLL en la vista DLL, dice: 'Imagen: 32 bits'. ¿Lo que da?

Si ejecuto corflags contra el dll en cuestión, me dice: ILONLY 1, 32BIT 0 pero PE PE32. Según tengo entendido, esto significa que sí, se compila solo en IL, no, no está limitado a 32 bits o a 64 bits, pero no estoy del todo claro. ¿La bandera PE32 tiene algo que ver con que se muestre como 32 bits como el anterior?

Respuesta

5

Su pregunta está relacionada con this question. Lo que está viendo en el explorador de procesos es el tipo de imagen, que es diferente del tipo de "compatibilidad de tiempo de ejecución" especificado en el ensamblaje corflags.

El punto de establecer "Cualquier CPU" es forzar el denominador más común tanto en la imagen original como en el ensamblado, de modo que permite que el arrancador de Windows para .NET elija qué tipo de Runtime será el más apropiado para el plataforma actual.

Por lo tanto, para su ejemplo, tiene una imagen de 32 bits (según lo especificado por el encabezado PE), que contiene un ensamblado "Any CPU" (como lo especifica CorFlags para el ensamblaje).

2

Luego obtienen JITted a 32 bits si se ejecuta en una plataforma de 32 bits o código de 64 bits si se ejecuta en x64 ... ¿verdad?

derecho, se puede comprobar mediante la ejecución de la misma exe compilado para Cualquier CPU:

sizeof (IntPtr) == 4 // cierto en 32 bits

sizeof (IntPtr) == 8 // verdadera en 64bit

Pero, si se hace referencia a su ensamblado en un proceso compilado solo para la plataforma de 32 bits, se jited a 32 bits (se ejecuta en WOW para Windows de 64 bits).

+0

gracias :) cualquier idea ¿por qué Process Explorer está siendo travieso? –