2010-08-22 12 views
10

Quelles sont les différences entre les applications .NET (4) 32 et 64 bits?Différences entre les applications .NET (4) 32 et 64 bits

Souvent, les applications 32 bits ont des problèmes d'exécution sur les machines 64 bits et inversement. Je sais que je peux déclarer un entier comme int32 et int64 (certainement int64 sur les systèmes 32 bits posent des problèmes). Existe-t-il d'autres différences entre la programmation d'une application 32 ou 64 bits ou d'une application compatible 32 ET 64 bits?

+3

cela peut aider - http://stackoverflow.com/questions/3102765/net-3-5-web-application-porting-to-64bit-potential-issues – InSane

+1

duplication possible de [trucs 64 bits pour le développement C#] (http://stackoverflow.com/questions/1889941/64-bits-stuff-for-c-development) –

Répondre

28

Quelques différences:

  1. applications 32 bits et 64 bits ne peuvent charger des DLL du même nombre de bits. Cela peut poser un problème pour les projets gérés si la cible de votre plate-forme est "Any CPU" et que vous faites référence à des DLL natives 32 bits P/Invoke. Le problème se pose lorsque votre programme "Any CPU" s'exécute sur une machine 64 bits, puisque votre application s'exécute comme un processus 64 bits. Lorsqu'il essaye de charger la dépendance native 32 bits DLL, il lève une exception (BadImageFormatException) et se bloque probablement.

  2. Il existe également des problèmes de système de fichiers et de registre. Un processus WOW64 qui essaie de lire à partir de C:\Program Files finira par être redirigé vers C:\Program Files (x86) sauf s'il désactive d'abord la redirection du système de fichiers Windows (voir Wow64DisableWow64FsRedirection). Pour les versions de Windows antérieures à Windows 7, il existait également des problèmes de réflexion de registre similaires aux problèmes de redirection de système de fichiers mentionnés ci-dessus. L'article MSDN Registry Reflection l'explique bien.

  3. Les types spécifiques à la plate-forme comme IntPtr auront des tailles différentes. Cela peut être un problème dans le code qui suppose une taille fixe (sérialisation, marshaling).

  4. Il existe des répertoires physiques distincts pour les fichiers 32 et 64 bits dans GAC. Pour mon système, ils sont au C:\Windows\Microsoft.NET\assembly\GAC_32 et C:\Windows\Microsoft.NET\assembly\GAC_64.

  5. La taille de l'espace d'adressage virtuel des applications 32 et 64 bits est différente. Pour les applications 32 bits, la taille est 2   Go (par défaut) ou 3   Go (avec 4GT activé). Pour les applications 64 bits, la taille est de 8   TB. L'espace d'adressage 32 bits peut être une limitation pour les très grandes applications. Un peu plus obscur, mais un grand nombre d'appels interprocessus Win32 ne fonctionnera pas entre un processus de 32 bits et 64 bits. Par exemple, un processus 32 bits peut échouer lorsque vous essayez d'appeler ReadProcessMemory sur un processus 64 bits. La même chose vaut pour WriteProcessMemory, EnumProcessModules, et beaucoup de méthodes similaires. Cela peut être vu dans les applications C# si vous essayez d'énumérer les modules d'une application 64 bits à partir d'une application 32 bits en utilisant l'API System.Diagnostics.Process.Modules.

+0

Bonne réponse! Q: Est-ce que IntPtr n'est pas le seul type dépendant de la plate-forme? – stakx

3

En général, je pense que vous ne devriez pas avoir de problèmes avec le code managé.

Des problèmes potentiels peuvent provenir d'un code non géré. Par exemple, étant donné que les tailles de variables sont différentes dans les systèmes 32 bits et 64 bits, les pointeurs sont différents, etc. Par exemple, la taille de la variable int en C/C++ dépend du système. Comme pour le code managé comme déjà mentionné, WoW peut gérer cela.