2011-12-08 13 views
7

Recientemente comencé un nuevo trabajo, y una de las primeras cosas de las que noté que todos estaban hablando fue "actualizando" Todas nuestras aplicaciones .NET a x64. Inicialmente pensé que esto era extraño, ya que todos sabemos que .NET compila a IL independiente de la plataforma y el CLR específico ejecuta el código.Cuándo segmentar x64 en Visual Studio

Mirando un poco más lejos, encontré this helpful article y this SO post que me ayudaron a explicar las cosas.

Así que ahora entiendo que el IL no se cambia, solo los metadatos básicamente dicen que se ejecutan en WOW64 o no en un sistema x64 (en pocas palabras).

Así que si estoy en un sistema x64, puedo especificar "Cualquier CPU" para ejecutar de forma nativa, pero no admitiré db de 32 bits; Puedo especificar "x86" que admitirá dlls de 32 bits (ya que ambos se ejecutarán en WOW64); , pero ¿cuándo debo especificar "x64"? Parece que los dlls de 64 bits serían compatibles en el escenario "Cualquier CPU" en un sistema x64. ¿Esto es así si quiero evitar que alguien ejecute mi aplicación en un sistema de 32 bits o asegurar que falle al intentar cargar archivos dll de 32 bits?

También me parece que usted solo necesita configurarlo en otro lugar que no sea "Cualquier CPU" si tiene un dll de terceros que preocuparse en su proyecto. ¿Es mejor dejarlo como "cualquier CPU" para cualquier otro proyecto que no trate con otros dlls?

Si yo llegara a establecer mi objetivo de "x 86" porque tengo una tercera parte DLL de 32 bits, es mi aplicación actualmente considerada como de 64 bits que se ejecuta en si en un sistema de 64 bits poco menos de WOW64?

+1

No puede ignorarlo en su instalador. Si tiene un requisito de x64, debe establecer la configuración de Plataforma de destino del instalador en x64. No se instalará correctamente si no lo hace. Dado que el instalador ahora ya asegura que un sistema operativo de 64 bits está disponible, ya no importa lo que seleccione para su proyecto EXE. También podría usar AnyCPU. –

Respuesta

7

Sí, especificaría que el proyecto debería compilarse a x64 si llama a una DLL de 64 bits (ya sea porque es nativa o es una DLL administrada que está llamando a una DLL nativa de 64 bits, etc.)

Igualmente, para especificar que debe ser x86 si se trata de archivos DLL de 32 bits de terceros; no se considerará una aplicación de 64 bits si se ejecuta en una versión de Windows de 64 bits.

Si solo está tratando con el código administrado puro, entonces dejaría las cosas como "cualquiera". También, en general, dejo DLL como "any" también, incluso si el ejecutable se especificará como x86 o x64.

E incluso si está tratando con dlls nativos, aún podrá salirse con la suya dejándolo como "cualquiera" si está utilizando PInvoke; puede tener dos versiones de una clase que la envuelve, una para x86, otra para x64 y elija cuál usar en tiempo de ejecución al verificar la propiedad IntPtr.Size.

Y por supuesto, si su aplicación necesita más de 4 GB de RAM y desea hacer cumplir que tiene que ejecutarse en un sistema operativo de 64 bits, entonces también necesitará apuntar a x64.

+0

Muy a menudo puede usar el mismo p/invocaciones para 32 y 64 bits –

2

Debería especificar x64 si usa código nativo a través de COM o P/Invoke que no tiene una versión de 32 bits.