¿Qué significa el objetivo de Visual Studio "Cualquier CPU"?


Tengo cierta confusión relacionada con las opciones de compilación de.NET platform 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 de "Cualquier CPU" y encontré que son los ejecutables x86 (¡quién no vería eso venir!). Por lo tanto, hay alguna diferencia entre la orientación ejecutable a x86 vs "Cualquier CPU"?

Otra cosa que noté, es que los proyectos C++ administrados no tienen esto plataforma como opción. ¿Por qué es eso? ¿Eso significa que mi sospecha de que" cualquier CPU " ejecutable es simple de 32 bits es correcta?

Author: iliketocode, 2009-02-05

8 answers

Un ensamblado AnyCPU se ajustará al código de 64 bits cuando se cargue en un proceso de 64 bits y de 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 ensamblado (algo probablemente no administrado) que requiere 32 bits o 64 bits.

 340
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-03 13:49:35

Creo que la mayoría de las cosas importantes ya se han dicho, pero solo pensé en agregar una cosa: Si compilas como Cualquier CPU y corres en una plataforma x64, entonces no podrás cargar archivos DLL de 32 bits, porque tu aplicación no se inició en WOW64, pero esos archivos dll deben ejecutarse allí.
Si compilas como x86, entonces el sistema x64 ejecutará tu aplicación en WOW64, y podrás 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 es generalmente 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, una aplicación paquete con la configuración x86 no se ejecutará, como el Xbox o algo Dispositivos principales de IoT. Sin embargo, para un PC, un paquete x86 es el más seguro elección y tiene el mayor alcance para la implementación de dispositivos. A substancial parte de los dispositivos Windows 10 continúan ejecutando la versión x86 de Windows.

 271
Author: Paul A Jungwirth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-16 20:45:45

Aquí hay una descripción 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 ninguna optimización x64 específica, cambiaría la compilación para decir específicamente "x86."

La razón de esto es que a veces puedes obtener algunos archivos DLL que chocan o algún código que termina chocando WOW en el entorno x64. Al especificar específicamente x86, el sistema operativo x64 tratará la aplicación como una aplicación x86 pura y asegúrese de que todo funcione sin problemas.

 50
Author: Dillie-O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-04 19:42:32

Echa un vistazo al artículo Visual Studio. NET Platform Target Explicado.

La configuración predeterminada," Cualquier CPU", significa que el ensamblado 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 el assembly se llama desde una aplicación de 64 bits, se realizará como un montaje de 64 bits y así sucesivamente.

Se ha informado que el enlace anterior está roto, así que aquí está otro artículo con una explicación similar: Lo Que AnyCPU Realmente Significa A Partir De. NET 4.5 y Visual Studio 11

 44
Author: NYSystemsAnalyst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-11 13:41:07

"Cualquier CPU" significa que cuando se inicia el programa,. NET Framework averiguará, basado en la bitness del sistema operativo, si se debe ejecutar el 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.

dumpbin YourProgram.exe /headers

Te dirá el bitness de su programa, y mucho más.

 39
Author: AngryHacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-07 21:33:02

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

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

 31
Author: Adam Tegen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-05 17:16:11

Crédito para reservar " CLR vía C#", vea esto:

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

introduzca la descripción de la imagen aquí

 22
Author: Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-20 14:35:57

Recomiendo leer este post .

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á compilado en código 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 en código máquina x86.
  • Si el proceso se ejecuta en un sistema Windows ARM, se ejecuta como un proceso de 32 bits. IL se compila para armar la máquina codificar.
 4
Author: mamczas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-07 05:55:55