.net - plataforma - solution platform visual studio
¿Qué significa el objetivo de Visual Studio "Cualquier CPU"? (8)
Tengo alguna 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 archivo ejecutable de salida de esta compilación "Cualquier CPU" y encontré que son los ejecutables x86 (¡quién no lo vería venir) Entonces, ¿hay alguna diferencia entre la orientación del ejecutable a x86 y "Cualquier 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 de que los ejecutables de "Cualquier CPU" son simples de 32 bits es correcta?
"Cualquier CPU" significa que cuando se inicie el programa, .NET Framework descubrirá, según el bitness 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 lo que respecta a sus sospechas, solo vaya a la línea de comandos de Visual Studio 2008 y ejecute lo siguiente.
dumpbin YourProgram.exe /headers
Le dirá el bitness de su programa, además de mucho más.
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 ejecutará en plataformas x86 y x64, y no tiene ninguna optimización específica de x64, cambiaría la compilación para que diga específicamente "x86".
La razón de esto es que a veces puedes obtener algunos archivos DLL que colisionan o algún código que termina rompiendo 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 se asegurará de que todo funcione sin problemas.
Crédito para reservar "CLR via C #", vea esto:
Creo que la mayoría de las cosas importantes se han dicho, pero pensé que agregaría una cosa: si compilas como Cualquier CPU y ejecutas en una plataforma x64, entonces no podrás cargar archivos DLL de 32 bits, porque su aplicación no se inició en WOW64, pero esas dlls 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 cualquiera de los entornos, 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 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 aplicaciones con la configuración x86, como la 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 alcance para la implementación de dispositivos. Una parte sustancial de los dispositivos con Windows 10 continúan ejecutando la versión x86 de Windows.
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 byte que es interpretado por .NET Framework en tiempo de ejecución.
C ++ no tiene esta opción porque está compilada en un código de máquina que es específico de la plataforma.
Echa un vistazo al artículo Explicación de la plataforma de 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 de 64 bits en una máquina de 64 bits y de 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 64 bits y así sucesivamente.
Se ha informado que el enlace anterior está roto, por lo que aquí hay otro artículo con una explicación similar: Lo que AnyCPU realmente significa como .NET 4.5 y Visual Studio 11
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 se compila al 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 se compila al 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 se compila a código de máquina ARM.
Un ensamblaje AnyCPU JIT para código de 64 bits cuando se carga en un proceso de 64 bits y de 32 bits cuando se carga en un proceso de 32 bits.
Al limitar la CPU, usted estaría diciendo: Hay algo que está siendo usado por el ensamblaje (algo que probablemente no se administra) que requiere 32 bits o 64 bits.