Различия между 32 и 64-битными приложениями.NET (4)
В чем разница между 32 и 64-битными приложениями.NET (4)?
Часто у 32-битных приложений возникают проблемы с запуском на 64-битных машинах и наоборот. Я знаю, что могу объявить целое число как int32 и int64 (конечно, int64 на 32-битных системах создает проблемы). Существуют ли другие различия между программированием 32- или 64-разрядного или 32- и 64-разрядного совместимого приложения?
3 ответа
Некоторые отличия:
32-битные и 64-битные приложения могут загружать только DLL с одинаковой битностью. Это может быть проблемой для управляемых проектов, если целью вашей платформы является "Любой ЦП" и вы ссылаетесь на 32-битные собственные библиотеки P/Invoke. Проблема возникает, когда ваша программа "Любой процессор" работает на 64-битной машине, поскольку ваше приложение работает как 64-битный процесс. Когда он пытается загрузить 32-битную собственную зависимость DLL, он выдаст исключение (
BadImageFormatException
) и скорее всего сбой.Есть также проблемы с файловой системой и реестром. Процесс WOW64, который пытается прочитать с
C:\Program Files
в конечном итоге будет перенаправлен наC:\Program Files (x86)
если только он сначала не отключит перенаправление файловой системы Windows (см.Wow64DisableWow64FsRedirection
). В версиях Windows до Windows 7 также были проблемы с отображением реестра, которые были аналогичны проблемам перенаправления файловой системы, упомянутым выше. В статье MSDN Registry Reflection это хорошо объясняется.Платформо-зависимые типы, такие как
IntPtr
будет иметь разные размеры. Это может быть проблемой в коде, который принимает фиксированный размер (сериализация, маршалинг).В GAC есть отдельные физические каталоги для 32- и 64-битных файлов. Для моей системы они находятся на
C:\Windows\Microsoft.NET\assembly\GAC_32
а такжеC:\Windows\Microsoft.NET\assembly\GAC_64
,Размер виртуального адресного пространства 32- и 64-разрядных приложений различен. Для 32-разрядных приложений размер составляет 2 ГБ (по умолчанию) или 3 ГБ (с включенным 4GT). Для 64-битных приложений размер составляет 8 ТБ. 32-битное адресное пространство может быть ограничением для очень больших приложений.
Немного более непонятно, но многие межпроцессные вызовы Win32 не будут работать между 32- и 64-битными процессами. Например, 32-разрядный процесс может завершиться неудачно при попытке вызвать
ReadProcessMemory
на 64-битном процессе. То же самое касаетсяWriteProcessMemory
,EnumProcessModules
и много похожих методов. Это можно увидеть в приложениях C#, если вы попытаетесь перечислить модули 64-разрядного приложения из 32-разрядного приложения, используяSystem.Diagnostics.Process.Modules
API.
В общем, я думаю, что у вас не должно быть проблем с управляемым кодом.
Потенциальные проблемы могут исходить из неуправляемого кода. Например, поскольку размеры переменных различаются в 32-разрядных и 64-разрядных системах, указатели отличаются и т. Д. Например, размер переменной int в C/C++ зависит от системы. Что касается управляемого кода, как уже упоминалось, WoW может справиться с этим.
Управляемый код x64 будет использовать потоковые SIMD-расширения (SSE) для вычисления двойного числа / числа с плавающей запятой вместо x87 с плавающей запятой (FPU) при использовании управляемого кода x86.
В дополнение к другим ответам я хотел бы добавить еще одну вещь: мы можем запускать программное обеспечение 32-битной системы на 64, но, наоборот, невозможно!