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


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

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

3 10

3 ответа:

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

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

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

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

  4. Существуют отдельные физические каталоги для 32-и 64-разрядных файлов вGAC . Для моей системы они находятся в 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. Немного более неясно, но многие вызовы interprocess Win32 не будут работать между 32 - и 64-разрядными процессами. Например, 32-разрядный процесс может завершиться ошибкой при попытке вызова ReadProcessMemory на 64-битном процессе. То же самое относится и к WriteProcessMemory, EnumProcessModules, и много подобных методов. Это можно увидеть в приложениях C#, если при попытке перечислить модули 64-разрядного приложения из 32-разрядного приложения с помощью System.Diagnostics.Process.Modules API.

В общем, я думаю, что у вас не должно быть никаких проблем с управляемым кодом.

Потенциальные проблемы могут возникнуть из-за неуправляемого кода. Например, поскольку размеры переменных различны в 32-битных и 64-битных системах, указатели различны и т. д. Например, размер переменной int в C / C++ зависит от системы. Что касается управляемого кода, как уже упоминалось, WoW может справиться с этим.

X64 управляемый код будет использовать Streaming SIMD Extensions (SSE) для вычисления double/float вместо x87 Floating Point Unit (FPU) при использовании x86 управляемого кода.