2010-08-22 5 views
10

Quali sono le differenze tra le applicazioni .NET (32) a 64 e 64 bit?Differenze tra applicazioni .NET (4) a 32 e 64 bit.

Spesso le applicazioni a 32 bit hanno problemi di esecuzione su macchine a 64 bit e viceversa. So di poter dichiarare un intero come int32 e int64 (certamente int64 su sistemi a 32 bit crea problemi). Esistono altre differenze tra la programmazione di un'applicazione 32 o 64 bit o di un'applicazione compatibile sia a 32 che a 64 bit?

+3

questo può aiutare - http://stackoverflow.com/questions/3102765/net-3-5-web-application-porting-to-64bit-potential-issues – InSane

+1

possibile duplicato di [roba a 64 bit per lo sviluppo C#] (http://stackoverflow.com/questions/1889941/64-bits-stuff-for-c-development) –

risposta

28

alcune differenze:

  1. applicazioni a 32 bit e 64 bit possono caricare solo DLL dello stesso numero di bit. Questo può essere un problema per i progetti gestiti se il target della tua piattaforma è "Any CPU" e fai riferimento o alle DLL native a 32 bit di P/Invoke. Il problema sorge quando il programma "Any CPU" viene eseguito su un computer a 64 bit, poiché l'applicazione viene eseguita come processo a 64 bit. Quando tenta di caricare la dipendenza della DLL nativa a 32 bit, genera un'eccezione (BadImageFormatException) e un probabile arresto anomalo.

  2. Ci sono anche problemi di file system e di registro. Un processo WOW64 che tenta di leggere da C:\Program Files finirà per essere reindirizzato a C:\Program Files (x86) a meno che non disabiliti per prima cosa il reindirizzamento del filesystem di Windows (vedere Wow64DisableWow64FsRedirection). Per le versioni di Windows precedenti a Windows 7, c'erano anche problemi di riflessione del registro simili ai problemi di reindirizzamento del file system sopra menzionati. L'articolo MSDN Registry Reflection lo spiega bene.

  3. I tipi specifici della piattaforma come IntPtr avranno dimensioni diverse. Questo potrebbe essere un problema nel codice che presuppone una dimensione fissa (serializzazione, marshalling).

  4. Esistono directory fisiche separate per i file a 32 e 64 bit nello GAC. Per il mio sistema, sono a C:\Windows\Microsoft.NET\assembly\GAC_32 e C:\Windows\Microsoft.NET\assembly\GAC_64.

  5. La dimensione dello spazio di indirizzamento virtuale delle applicazioni a 32 e 64 bit è diversa. Per le applicazioni a 32 bit, la dimensione è 2   GB (predefinita) o 3   GB (con 4GT attivato). Per le applicazioni a 64 bit, la dimensione è 8   TB. Lo spazio degli indirizzi a 32 bit può essere una limitazione per applicazioni molto grandi.

  6. Un po 'più oscuro, ma un sacco di interprocessi chiamate Win32 non funzionerà tra un processo a 32 e 64 bit. Ad esempio, un processo a 32 bit può non riuscire quando si tenta di chiamare ReadProcessMemory in un processo a 64 bit. Lo stesso vale per WriteProcessMemory, EnumProcessModules e molti altri metodi simili. Questo può essere visto nelle applicazioni C# se si tenta di enumerare i moduli di un'applicazione a 64 bit da un'applicazione a 32 bit utilizzando l'API System.Diagnostics.Process.Modules.

+0

Ottima risposta! D: Non è 'IntPtr' il tipo * only * safe-dependent-safe? – stakx

3

In generale, penso che non si dovrebbero avere problemi con il codice gestito.

Potenziali problemi possono derivare dal codice non gestito. Ad esempio, poiché le dimensioni variabili sono diverse nei sistemi a 32 e 64 bit, i puntatori sono diversi, ecc. Ad esempio, la dimensione della variabile int in C/C++ dipende dal sistema. Per quanto riguarda il codice gestito come già accennato, WoW può gestirlo.