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

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

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

11
задан Peter Mortensen 23 June 2012 в 17:30
поделиться

2 ответа

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

  1. 32-битные и 64-битные приложения могут загружать только библиотеки DLL одинаковой разрядности. Это может быть проблемой для управляемых проектов, если целевой платформой является «Любой процессор» и вы ссылаетесь на 32-разрядные собственные библиотеки DLL 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-битного приложения с помощью API System.Diagnostics.Process.Modules .

30
ответ дан 3 December 2019 в 02:00
поделиться

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

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

3
ответ дан 3 December 2019 в 02:00
поделиться