Различия между 32 и 64-битными приложениями.NET (4)

В чем разница между 32 и 64-битными приложениями.NET (4)?

Часто у 32-битных приложений возникают проблемы с запуском на 64-битных машинах и наоборот. Я знаю, что могу объявить целое число как int32 и int64 (конечно, int64 на 32-битных системах создает проблемы). Существуют ли другие различия между программированием 32- или 64-разрядного или 32- и 64-разрядного совместимого приложения?

3 ответа

Решение

Некоторые отличия:

  1. 32-битные и 64-битные приложения могут загружать только DLL с одинаковой битностью. Это может быть проблемой для управляемых проектов, если целью вашей платформы является "Любой ЦП" и вы ссылаетесь на 32-битные собственные библиотеки P/Invoke. Проблема возникает, когда ваша программа "Любой процессор" работает на 64-битной машине, поскольку ваше приложение работает как 64-битный процесс. Когда он пытается загрузить 32-битную собственную зависимость DLL, он выдаст исключение (BadImageFormatException) и скорее всего сбой.

  2. Есть также проблемы с файловой системой и реестром. Процесс WOW64, который пытается прочитать с C:\Program Files в конечном итоге будет перенаправлен на C:\Program Files (x86) если только он сначала не отключит перенаправление файловой системы Windows (см. Wow64DisableWow64FsRedirection). В версиях Windows до Windows 7 также были проблемы с отображением реестра, которые были аналогичны проблемам перенаправления файловой системы, упомянутым выше. В статье MSDN Registry Reflection это хорошо объясняется.

  3. Платформо-зависимые типы, такие как IntPtr будет иметь разные размеры. Это может быть проблемой в коде, который принимает фиксированный размер (сериализация, маршалинг).

  4. В GAC есть отдельные физические каталоги для 32- и 64-битных файлов. Для моей системы они находятся на C:\Windows\Microsoft.NET\assembly\GAC_32 а также C:\Windows\Microsoft.NET\assembly\GAC_64,

  5. Размер виртуального адресного пространства 32- и 64-разрядных приложений различен. Для 32-разрядных приложений размер составляет 2 ГБ (по умолчанию) или 3 ГБ (с включенным 4GT). Для 64-битных приложений размер составляет 8 ТБ. 32-битное адресное пространство может быть ограничением для очень больших приложений.

  6. Немного более непонятно, но многие межпроцессные вызовы 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, но, наоборот, невозможно!

Другие вопросы по тегам