Tengo cierta confusión relacionada con las opciones de compilación de la plataforma .NET en Visual Studio 2008.
¿Cuál es el objetivo de compilación "Cualquier CPU" y qué tipo de archivos genera? Examiné el ejecutable de salida de esta compilación "Cualquier CPU" y descubrí que son ejecutables x86 (¡quién no lo vería venir!). Entonces, ¿hay alguna diferencia entre apuntar ejecutable a x86 frente a "Any CPU"?
Otra cosa que noté es que los proyectos administrados de C ++ no tienen esta plataforma como una opción. ¿Porqué es eso? ¿Eso significa que mi sospecha acerca de que los ejecutables de "Cualquier CPU" son simples de 32 bits es correcta?
.net
visual-studio-2008
build
64-bit
galets
fuente
fuente
Any CPU
y se está ejecutando en un sistema operativo de 64 bits, pierde la capacidad de editar y continuar durante la depuración. (Estás depurando efectivamente un proceso de 64 bits). Puede hacer que el objetivo del proyecto de iniciox86
evite esto mientras se depura. (Las asambleas a las que se hace referencia en el proyecto de inicio pueden continuar apuntandoAny CPU
.x86
biblioteca consumida por unaAnyCPU
aplicación donde tuve que configurarlaPrefer 32-bit
para evitar un error de carga.Respuestas:
Un ensamblaje AnyCPU JITARÁ en código de 64 bits cuando se cargue en un proceso de 64 bits y 32 bits cuando se cargue en un proceso de 32 bits.
Al limitar la CPU, estaría diciendo: el ensamblaje está utilizando algo (algo probablemente no administrado) que requiere 32 bits o 64 bits.
fuente
Creo que se ha dicho la mayoría de las cosas importantes, pero solo pensé en agregar una cosa: si compila como Any CPU y se ejecuta en una plataforma x64, entonces no podrá cargar archivos DLL de 32 bits, porque su aplicación no se inició en WoW64 , pero esos archivos DLL deben ejecutarse allí.
Si compila como x86, entonces el sistema x64 ejecutará su aplicación en WoW64 y podrá cargar archivos DLL de 32 bits.
Así que 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 (Especifique el tipo de imagen CLR)
Por cierto, esta otra documentación de Microsoft está de acuerdo en que x86 suele ser una opción más portátil:
fuente
Aquí hay una descripción general rápida que explica los diferentes objetivos de compilación.
Desde mi propia experiencia, si está buscando construir un proyecto que se ejecute en plataformas x86 y x64, y no tiene optimizaciones específicas de x64, cambiaría la construcció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.
fuente
Consulte el artículo Visual Studio .NET Platform Target Explicado .
Se ha informado que el enlace anterior está roto, por lo que aquí hay otro artículo con una explicación similar: lo que realmente significa AnyCPU a partir de .NET 4.5 y Visual Studio 11
fuente
Crédito al libro "CLR vía C #" , vea esto:
fuente
"Cualquier CPU" significa que cuando se inicia el programa, .NET Framework determinará, en función del bit del sistema operativo, si ejecutar su programa en 32 bits o 64 bits.
Hay una diferencia entre x86 y cualquier CPU : en un sistema x64, su ejecutable compilado para X86 se ejecutará como un ejecutable de 32 bits.
En cuanto a sus sospechas, simplemente vaya a la línea de comandos de Visual Studio 2008 y ejecute lo siguiente.
Le dirá la bondad de su programa, además de mucho más.
fuente
Cualquier CPU significa que funcionará en cualquier plataforma. Esto se debe a que el código administrado es similar a Java. Piense que está 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 en código de máquina que es específico de la plataforma.
fuente
Recomiendo leer esta publicación .
Al usar AnyCPU , la semántica es la siguiente:
fuente