2009-02-05 29 views
404

Tengo alguna confusión relacionada con las opciones de compilación de la plataforma .NET en Visual Studio 2008.¿Qué significa el objetivo "Cualquier CPU" de Visual Studio?

¿Cuál es el objetivo de compilación de "Cualquier CPU" y qué tipo de archivos genera? Examiné el ejecutable de salida de esta compilación de "Cualquier CPU" y descubrí que son los ejecutables x86 (¡quién no lo vería venir!). Entonces, ¿hay alguna diferencia entre el ejecutable de targeting a x86 vs "Any CPU"?

Otra cosa que noté, es que los proyectos C++ administrados no tienen esta plataforma como una opción. ¿Porqué es eso? ¿Eso significa que mi sospecha sobre los ejecutables "Any CPU" que son simples de 32 bits es correcta?

+4

Una cosa más a tener en cuenta al decidir qué destino plataforma de empleo: si el objetivo del proyecto * inicio * es 'Cualquier CPU' y estás runnning en un sistema operativo de 64 bits, se pierde la capacidad de * Editar y continuar * durante la depuración. (Estás depurando efectivamente un proceso de 64 bits). Puede hacer que el * Proyecto de inicio * objetivo 'x86' evite esto durante la depuración. (Los ensamblados a los que se hace referencia desde el proyecto de inicio pueden continuar dirigidos a 'Cualquier CPU '. –

+8

@CristiDiaconescu Con VS2013 Editar y continuar ahora es posible – ms007

Respuesta

317

AnyCPU El ensamblado JIT tendrá un código de 64 bits cuando se cargue en el proceso de 64 bits y 32 bits cuando se cargue en un proceso de 32 bits.

Al limitar la CPU, estaría diciendo: Hay algo que está siendo utilizado por el conjunto (algo probablemente no gestionado) que requiere 32 bits o 64 bits.

+2

Entonces, ¿cómo puedo producir ensamblados que JIT a x64 en C++? – galets

+40

C++ proyectos compilar a nativos código, entonces el compilador JIT no está involucrado ... por lo tanto, no puede hacer lo que está pidiendo. – cplotts

+7

@cplotts: desde @galets hizo esta pregunta hace 3 meses es poco probable que vea su respuesta. Utilice @galets prefijo en su comentario similar a como lo tengo aquí para que reciba una alerta acerca de su respuesta. – AnthonyWJones

50

Aquí hay un quick overview que explica los diferentes objetivos de compilación.

Según mi propia experiencia, si está buscando construir un proyecto que se ejecute en aplicaciones x86 y x64, y no tiene ninguna optimización x64 específica, cambiaría la versión para decir específicamente "x86 "

La razón de esto es que a veces puede obtener algunos archivos DLL que colisionan o algún código que termina bloqueando WOW en el entorno x64. Especificando específicamente x86, el sistema operativo x64 tratará la aplicación como una aplicación pura x86 y se asegurará de que todo funcione sin problemas.

+27

Lo que podría ser terrible si escribe para un entorno de servidor y desea que su aplicación pueda usar más luego 2GB de memoria. También está optando por cualquier optimización de JIT x64 que algún día pueda llegar al final de la página. –

39

"Cualquier CPU" significa que cuando se inicia el programa, .NET Framework determinará, basándose en el bitness del sistema operativo, si ejecutará su programa en 32 bits o 64 bits.

Hay una diferencia entre x 86 y Cualquier CPU: en un sistema x64, el ejecutable compilado para X86 se ejecutará como un ejecutable de 32 bits.

En cuanto a sus sospechas, vaya a la línea de comandos Visual   Studio   2008 y ejecute lo siguiente.

dumpbin YourProgram.exe /headers 

Le dirá la fragilidad de su programa, y ​​mucho más.

+6

Si está integrado en "cualquier CPU", se mostrará como 32 bits en los encabezados de dumpbin. – Kirbinator

43

Revisa el artículo Visual Studio .NET Platform Target Explained.

La configuración por defecto, "Cualquier CPU", significa que el montaje se ejecutará forma nativa en la CPU se está ejecutando actualmente. Es decir, ejecutará como 64 bits en una máquina de 64 bits y 32 bits en una máquina de 32 bits. Si se llama al ensamblaje desde una aplicación de 64 bits, funcionará como un ensamblaje de de 64 bits y así sucesivamente.

El enlace de arriba se ha informado que está roto, así que aquí es otro artículo con una explicación similar: What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

+0

Enlace roto: ir a un dominio estacionado ahora. –

+0

Agregué un enlace a un segundo artículo con información similar. Dejé el primer enlace en caso de que ese dominio se reactive alguna vez. – NYSystemsAnalyst

31

Cualquier CPU significa que funcionará en cualquier plataforma. Esto se debe a que el código administrado es similar a Java. Piense en ello como compilado en un código de bytes interpretado por .NET Framework en tiempo de ejecución.

C++ no tiene esta opción porque está compilada con código de máquina que es específico de la plataforma.

+10

+1 para responder la primera parte de la pregunta que nadie más hizo (sobre los proyectos C++ que no tienen AnyCPU como opción). – cplotts

250

Creo que la mayoría de las cosas importantes se ha dicho, pero yo sólo pensé que me gustaría añadir una cosa
si compila como Cualquier CPU y ejecuta en una plataforma x64, entonces no va a ser capaz de cargar Dlls de 32 bits, porque tu aplicación no se inició en WOW64, pero esos dlls deben ejecutarse allí.
Si compila como x86, el sistema x64 ejecutará su aplicación en WOW64 y podrá cargar dlls de 32 bits.
Creo que debería elegir "Cualquier CPU" si sus dependencias pueden ejecutarse en cualquier entorno, pero elija x86 si tiene dependencias de 32 bits. Este artículo de Microsoft explica esto un poco:

/CLRIMAGETYPE (Specify Type of CLR Image)

+5

Agradable agregar !!!! –

+2

Quizás pueda editar su respuesta para decir cómo se puede determinar si una determinada DLL es solo de 32 bits. Por lo que sé, [esto] (http://stackoverflow.com/a/2418287/848344) debería resolverlo. Creo que esperamos DLL que también sean "Cualquier CPU", en lugar de solo x86. –

+0

+1 una distinción importante. Fue necesario utilizar una dependencia de 32 bits (que no se identificó como tal). No se pudieron descifrar los mensajes de error crípticos de tiempo de ejecución. En una corazonada cambió el objetivo de la CPU y funcionó, pero fue en busca de "por qué". Será agradable algún día cuando todo sea de 64 bits y los problemas de incompatibilidad parecerán pintorescos, como 16bit frente a 32 bits ahora. –

1

recomiendo la lectura de este post.

Al usar AnyCPU, la semántica es la siguiente:

  • Si el proceso se ejecuta en un sistema Windows de 32 bits, que se ejecuta como un proceso de 32 bits. IL está compilado con código de máquina x86.
  • Si el proceso se ejecuta en un sistema Windows de 64 bits, se ejecuta como un proceso de 32 bits. IL está compilado con código de máquina x86.
  • Si el proceso se ejecuta en un sistema ARM de Windows, se ejecuta como un proceso de 32 bits. IL está compilado en código de máquina ARM.
+1

Solo si se selecciona "Preferir 32 bits". –

+0

Cuál es el valor predeterminado desde Visual Studio 11 – Moerwald

Cuestiones relacionadas