¿Cuál es el propósito de la configuración "Preferir 32 bits" en Visual Studio y cómo funciona realmente?

204

Ingrese la descripción de la imagen aquí

No me queda claro cómo el compilador sabrá automáticamente compilar para 64 bits cuando sea necesario. ¿Cómo sabe cuándo puede apuntar con confianza a 32 bits?

Tengo curiosidad sobre cómo el compilador sabe a qué arquitectura apuntar cuando compila. ¿Analiza el código y toma una decisión basada en lo que encuentra?

Aaron
fuente
Ah gracias. No vi eso antes. Todavía tengo curiosidad sobre cómo el compilador sabe automáticamente a qué arquitectura apuntar. ¿Algunas ideas?
Aaron

Respuestas:

219

Microsoft tiene una entrada de blog Qué significa realmente AnyCPU a partir de .NET 4.5 y Visual Studio 11 :

En .NET 4.5 y Visual Studio 11 el queso se ha movido. El valor predeterminado para la mayoría de los proyectos .NET es nuevamente AnyCPU, pero ahora hay más de un significado para AnyCPU. Hay un subtipo adicional de AnyCPU, "Cualquier CPU de 32 bits preferido", que es el nuevo valor predeterminado (en general, ahora hay cinco opciones para el conmutador del compilador / plataforma C #: x86, Itanium, x64, anycpu y anycpu32bitpreferred ) Cuando se utiliza el sabor "Preferir 32 bits" de 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 en 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 en 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 al código de máquina ARM.

La diferencia, entonces, entre "Cualquier CPU de 32 bits preferida" y "x86" es solo esto: una aplicación .NET compilada a x86 no se ejecutará en un sistema ARM Windows, pero una aplicación de "Cualquier CPU de 32 bits preferida" correrá con éxito.

Lex Li
fuente
12
+1. Además, la casilla de verificación "Preferir 32 bits" solo está habilitada para proyectos ejecutables .NET 4.5+.
Lee Grissom
12
Otra ventaja de anycpu32bitspreferred es que otro .exe que se ejecuta en 64 bits puede cargar ese ensamblado.
Bruno Martinez
30
Personalmente, creo que es horrible que configuran esto de forma predeterminada sin la configuración de Herramientas para desactivarlo. Peor aún, no puede buscarlo ya que no está en los archivos csproj a menos que esté apagado. Probablemente agregado debido a las incompatibilidades de Office Automation con CPUAny en una máquina x64 con la mayoría de las personas instalando Office de 32 bits.
Dave
66
@BrianDavidBerman existe, si establece false en 32, pero prefiere y establece x64 o Any CPU en una máquina de 64 bits.
Lex Li el
66
La diferencia entre x86 y cualquier CPU de 32 bits preferida es que, en este último caso, el indicador largeaddressaware se establece en el ejecutable. Esto significa que el proceso de 32 bits que se ejecuta en un sistema operativo de 64 bits puede usar 2 GB de memoria en modo x86 y 4 GB de memoria en cualquier modo preferido de CPU de 32 bits.
Nic
6

Aquí hay una respuesta simple:

Arco de aplicación

Nota: AnyCPU-32bitPreferred solo está disponible en .Net versión 4.5 y superior.

Yousha Aleayoub
fuente
2
¿Cuál es la diferencia entre "corre como 32 bits" versus corre como "WoW64". Pensé que WoW64 = "Windows (32 bits) en Windows64" y era necesario para que se ejecutara cualquier aplicación de 32 bits.
Peter Cordes el
¿Hay alguna fuente para esto? Aparentemente, en cualquier otro lugar aún me dicen que el valor predeterminado es anycpu32bitpreferred, que es una gran diferencia para las personas que se ejecutan en máquinas con Windows de 64 bits (eso es mucho).
Ran Sagy
@RanSagy simplemente puede probarlo creando un nuevo proyecto y comprobando Project -> Properties -> Build tab -> Platform target... pero tenga en cuenta que AnyCPU-32bitPreferredsolo está disponible en .Net versión 4.5 y superior. Por eso es lo predeterminado AnyCPU.
Yousha Aleayoub
En algunos casos, el mío estaba gris; Solo esperaba que hubiera algo de documentación sobre lo que sucede en .net 4.5+ o .net standard / core (o realmente, MSBuild 16)
Ran Sagy
-1

La razón es: en caso de que no desee utilizar más memoria con aplicaciones de 64 bits. Lo que significa que, si su aplicación es AnyCPU , desea ejecutar como 32 bits.

Para agregar más, la configuración en Visual Studio se dirige al CLR particular:

Visual Studio instala la versión de 32 bits del CLR en una computadora x86, y tanto la versión de 32 bits como la versión apropiada de 64 bits del CLR en una computadora con Windows de 64 bits. (Debido a que Visual Studio es una aplicación de 32 bits, cuando se instala en un sistema de 64 bits, se ejecuta bajo WOW64).

Consulte el artículo Aplicaciones de 64 bits ( MSDN ).

Perú
fuente
1
No estoy seguro de que sea exacto. Como tengo entendido, los ejecutables .NET independientemente de 32 o 64 todavía están limitados a alrededor de 2 GB por proceso.
JP Richardson
1
Edité mi respuesta. Pero no estoy seguro si esto es lo que estás buscando :)
Perú
2
@Aaron, el compilador esencialmente establece un indicador para el tiempo de ejecución para decidir si está bien cargar el ensamblaje (es decir, bloquear el ensamblaje solo x86 que se cargará en el proceso x64) y cómo iniciar el proceso (para el nuevo EXE) en función de los indicadores. Creo que IL es igual para ambos sabores.
Alexei Levenkov
1
@JPRichardson Sí, tienes razón. Pero en .net 4.5 tiene la opción de aumentar el tamaño. consulte MSDN
Perú
40
@JPRichardson, ni el ejecutable .Net de 32 ni 64 bits está limitado a 2 GB por proceso; en primer lugar, el espacio de direcciones por proceso es la restricción del nivel del sistema operativo (2/3 + GB para el proceso de 32 bits y mucho más para la versión de 32 bits) use más de 2 GB si el indicador "LargeAddressAware" está configurado en el ejecutable. Las únicas restricciones de 2 GB que conozco son sobre los tamaños de matriz / asignación que están limitados por el rango Int32 (aproximadamente 2 GB).
Alexei Levenkov