¿Qué significa el objective “Cualquier CPU” de Visual Studio?

Tengo cierta confusión relacionada con las opciones de comstackción de la plataforma .NET en Visual Studio 2008.

¿Cuál es el objective de comstackción de “Cualquier CPU” y qué tipo de archivos genera? Examiné el ejecutable de salida de esta comstackció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 administrados de C ++ 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?

Un ensamblado de AnyCPU JET al código de 64 bits cuando se carga en el proceso de 64 bits y 32 bits cuando se carga en un proceso de 32 bits.

Al limitar la CPU, diría: el ensamblaje está utilizando algo (algo probablemente no gestionado) que requiere 32 bits o 64 bits.

Creo que se ha dicho la mayoría de las cosas importantes, pero pensé que agregaría una cosa: si comstack como Cualquier CPU y se ejecuta en una plataforma x64, entonces no podrá cargar dlls de 32 bits, porque su aplicación no se inició en WOW64, pero esos dlls deben ejecutarse allí.
Si comstack como x86, entonces el sistema x64 ejecutará su aplicación en WOW64, y podrá cargar dlls de 32 bits.
Por lo tanto, creo que debe 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 (Especificar tipo de imagen CLR)

Por cierto, esta otra documentación de Microsoft acepta que x86 suele ser una opción más portátil:

Elegir x86 es generalmente la configuración más segura para un paquete de aplicaciones, ya que se ejecutará en casi todos los dispositivos. En algunos dispositivos, no se ejecutará un paquete de aplicación con la configuración x86, como Xbox o algunos dispositivos IoT Core. Sin embargo, para una PC, un paquete x86 es la opción más segura y tiene el mayor scope para el despliegue de dispositivos. Una parte sustancial de los dispositivos con Windows 10 continúa ejecutando la versión x86 de Windows.

Aquí hay una descripción general rápida que explica los diferentes objectives de comstackción.

Desde mi propia experiencia, si estás buscando construir un proyecto que se ejecutará en plataformas x86 y x64, y no tienes 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.

Vea el artículo Explicación de la plataforma Visual Studio .NET .

La configuración predeterminada, “Cualquier CPU”, significa que el ensamblaje se ejecutará de forma nativa en la CPU en la que se está ejecutando actualmente. Es decir, se 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 ensamblado desde una aplicación de 64 bits, funcionará como un ensamblaje de 64 bits y así sucesivamente.

Se ha informado que el enlace anterior está roto, así que aquí hay otro artículo con una explicación similar: Lo que AnyCPU realmente significa a partir de .NET 4.5 y Visual Studio 11

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

Existe una diferencia entre x86 y cualquier CPU : en un sistema x64, su ejecutable comstackdo para X86 se ejecutará como un ejecutable de 32 bits.

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

 dumpbin YourProgram.exe /headers 

Le dirá la fragilidad de su progtwig, más mucho más.

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 comstackdo en un código de bytes interpretado por .NET Framework en tiempo de ejecución.

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

Crédito para reservar “CLR a través de C #”, vea esto:

https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38

enter image description here

Recomiendo leer esta publicación.

Cuando se usa AnyCPU, la semántica es la siguiente:

  • Si el proceso se ejecuta en un sistema Windows de 32 bits, se ejecuta como un proceso de 32 bits. IL está comstackdo 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á comstackdo 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á comstackdo en código de máquina ARM.