Różnice między 32 A 64-bit.NET 4) wnioski
Jakie są różnice między aplikacjami 32 i 64-bitowymi. NET (4)?
Często aplikacje 32-bitowe mają problemy z uruchomieniem na maszynach 64-bitowych i odwrotnie. Wiem, że mogę zadeklarować liczbę całkowitą jako int32 i int64 (z pewnością int64 na systemach 32-bitowych sprawia problemy). Czy istnieją inne różnice między programowaniem aplikacji 32 lub 64-bitowej lub aplikacji kompatybilnej z 32 i 64-bitową?
3 answers
Niektóre różnice:
32-aplikacje bitowe i 64-bitowe mogą ładować biblioteki DLL tylko o tej samej bitowości. Może to być problem dla zarządzanych projektów, jeśli docelową platformą jest "dowolny procesor" i odwołujesz się lub P/wywołaj 32-bitowe natywne biblioteki DLL. Problem pojawia się, gdy program "Any CPU" działa na 64-bitowej maszynie, ponieważ aplikacja działa jako proces 64-bitowy. Gdy spróbuje załadować 32-bitową natywną zależność DLL, wyrzuci wyjątek (
BadImageFormatException
) i prawdopodobnie crash.Istnieją również problemy z systemem plików i rejestrem. Proces WOW64 , który próbuje odczytać z
C:\Program Files
, zostanie przekierowany doC:\Program Files (x86)
, chyba że najpierw wyłączy przekierowanie systemu plików Windows (zobaczWow64DisableWow64FsRedirection
). W przypadku wersji systemu Windows przed Windows 7 występowały również problemy z odbiciem rejestru, które były podobne do problemów z przekierowaniem systemu plików wymienionych powyżej. Artykuł MSDN odbicie rejestru wyjaśnia to cóż.Typy specyficzne dla platformy, takie jak
IntPtr
, będą miały różne rozmiary. Może to być problem w kodzie, który przyjmuje stały rozmiar (serializacja, marshaling).Istnieją oddzielne fizyczne Katalogi dla plików 32 - i 64-bitowych w GAC. Dla mojego systemu są na
C:\Windows\Microsoft.NET\assembly\GAC_32
iC:\Windows\Microsoft.NET\assembly\GAC_64
.Rozmiar wirtualnej przestrzeni adresowej aplikacji 32-i 64-bitowych jest różny. W przypadku aplikacji 32-bitowych rozmiar wynosi 2 GB (domyślnie) lub 3 GB (z 4GT włączone). W przypadku aplikacji 64-bitowych rozmiar wynosi 8 TB. 32-bitowa przestrzeń adresowa może być ograniczeniem dla bardzo dużych aplikacji.
Trochę bardziej niejasne, ale wiele wywołań Interprocess Win32 nie będzie działać pomiędzy 32 - i 64-bitowym procesem. Na przykład 32-bitowy proces może się nie udać podczas próby wywołania
ReadProcessMemory
W 64-bitowym procesie. To samo dotyczyWriteProcessMemory
,EnumProcessModules
, i wiele podobnych metod. Można to zobaczyć w aplikacjach C#, jeśli spróbuj wyliczyć moduły aplikacji 64-bitowej z aplikacji 32-bitowej, używającSystem.Diagnostics.Process.Modules
API.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-23 17:35:10
Ogólnie uważam, że nie powinieneś mieć żadnych problemów z kodem zarządzanym.
Potencjalne problemy mogą wynikać z niezarządzanego kodu. Na przykład, ponieważ zmienne wielkości są różne w systemach 32-bitowych i 64-bitowych, wskaźniki są różne, itp. Na przykład wielkość zmiennej int w C/C++ zależy od systemu. Jeśli chodzi o kod zarządzany, jak już wspomniano, WoW poradzi sobie z tym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-23 17:39:50
Kod zarządzany przez x64 będzie używał Streaming SIMD Extensions (SSE) do obliczania podwójnego/zmiennoprzecinkowego zamiast X87 Jednostka zmiennoprzecinkowa (FPU) Podczas używania kodu zarządzanego przez x86.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 09:04:10