2010-08-22 11 views
10

¿Cuáles son las diferencias entre las aplicaciones de .NET (4) de 32 y 64 bits?Diferencias entre aplicaciones de .NET (4) de 32 y 64 bits

A menudo, las aplicaciones de 32 bits tienen problemas para ejecutarse en máquinas de 64 bits y viceversa. Sé que puedo declarar un entero como int32 e int64 (ciertamente int64 en sistemas de 32 bits causa problemas). ¿Existen otras diferencias entre la programación de una aplicación compatible con 32 O 64 bits o con 32 y 64 bits?

+3

esto puede ayudar - http://stackoverflow.com/questions/3102765/net-3-5-web-application-porting-to-64bit-potential-issues – InSane

+1

posible duplicado de [64 bits cosas para el desarrollo de C#] (http://stackoverflow.com/questions/1889941/64-bits-stuff-for-c-development) –

Respuesta

28

Algunas diferencias:

  1. aplicaciones de 32 bits y de 64 bits sólo pueden cargar DLL del mismo valor de bits. Esto puede ser un problema para los proyectos administrados si el objetivo de su plataforma es "Cualquier CPU" y usted hace referencia a P/Invoke DLL nativos de 32 bits. El problema surge cuando su programa "Any CPU" se ejecuta en una máquina de 64 bits, ya que su aplicación se ejecuta como un proceso de 64 bits. Cuando intente cargar la dependencia DLL nativa de 32 bits, arrojará una excepción (BadImageFormatException) y probablemente fallará.

  2. También hay problemas con el sistema de archivos y el registro. Un proceso WOW64 que intente leer desde C:\Program Files terminará siendo redireccionado a C:\Program Files (x86) a menos que primero deshabilite la redirección del sistema de archivos de Windows (consulte Wow64DisableWow64FsRedirection). Para las versiones de Windows anteriores a Windows 7, también hubo problemas de reflexión del registro que eran similares a los problemas de redireccionamiento del sistema de archivos mencionados anteriormente. El artículo de MSDN Registry Reflection lo explica bien.

  3. Tipos específicos de plataforma como IntPtr tendrán diferentes tamaños. Esto podría ser un problema en el código que asume un tamaño fijo (serialización, clasificación).

  4. Existen directorios físicos separados para los archivos de 32 y 64 bits en el GAC. Para mi sistema, están en C:\Windows\Microsoft.NET\assembly\GAC_32 y C:\Windows\Microsoft.NET\assembly\GAC_64.

  5. El tamaño del espacio de direcciones virtuales de las aplicaciones de 32 y 64 bits es diferente. Para aplicaciones de 32 bits, el tamaño es 2   GB (predeterminado) o 3   GB (con 4GT activado). Para aplicaciones de 64 bits, el tamaño es 8   TB. El espacio de direcciones de 32 bits puede ser una limitación para aplicaciones muy grandes.

  6. Un poco más oscuro, pero un montón de llamadas entre Win32 no funcionarán entre un proceso de 32 y 64 bits. Por ejemplo, un proceso de 32 bits puede fallar al intentar llamar al ReadProcessMemory en un proceso de 64 bits. Lo mismo vale para WriteProcessMemory, EnumProcessModules, y muchos métodos similares. Esto puede verse en aplicaciones C# si intenta enumerar los módulos de una aplicación de 64 bits desde una aplicación de 32 bits utilizando la API System.Diagnostics.Process.Modules.

+0

¡Gran respuesta! P: ¿No es 'IntPtr' el * único * tipo seguro dependiente de la plataforma? – stakx

3

En general, creo que no debería haber ningún problema con el código administrado.

Los posibles problemas pueden provenir del código no administrado. Por ejemplo, dado que los tamaños variables son diferentes en los sistemas de 32 y 64 bits, los punteros son diferentes, etc. Por ejemplo, el tamaño de la variable int en C/C++ depende del sistema. En cuanto al código administrado como ya se mencionó, WoW puede manejar eso.

Cuestiones relacionadas