Подтвердить что ты не робот

Что означает цель Visual Studio "Любой процессор"?

У меня есть некоторая путаница, связанная с параметрами построения платформы .NET в Visual Studio 2008.

Что такое цель компиляции "Любой процессор" и какие файлы она генерирует? Я рассмотрел выходной исполняемый файл этой сборки "Any CPU" и обнаружил, что они являются исполняемыми файлами x86 (кто не увидит этого!). Итак, существует ли разница между таргетингом исполняемого файла на x86 и "Any CPU"?

Еще одна вещь, которую я заметил, заключается в том, что управляемые проекты на С++ не имеют этой платформы в качестве опции. Почему это? Означает ли это, что мои подозрения в том, что исполняемые файлы "Любой процессор" являются простыми 32-битными, правильно?

4b9b3361

Ответ 1

Сборка AnyCPU преобразуется в 64-битный код при загрузке в 64-битный процесс и 32-битный при загрузке в 32-битный процесс.

Ограничивая процессор, вы бы сказали: сборка использует что-то (что, вероятно, неуправляемо), для чего требуется 32 или 64 бита.

Ответ 2

Я думаю, что большинство важных вещей было сказано, но я просто хотел добавить одну вещь: если вы скомпилируете как Any CPU и работаете на платформе x64, то вы не сможете загрузить 32-битные dll, потому что Ваше приложение не было запущено в WOW64, но эти библиотеки должны работать там.
Если вы скомпилируете как x86, то система x64 запустит ваше приложение в WOW64, и вы сможете загрузить 32-битные библиотеки DLL.
Поэтому я думаю, что вы должны выбрать "Любой процессор", если ваши зависимости могут работать в любой среде, но выбрать x86, если у вас есть 32-битные зависимости. Эта статья от Microsoft объясняет это немного:

/CLRIMAGETYPE (указать тип изображения CLR)

Кстати, эта другая документация Microsoft соглашается с тем, что x86 обычно является более переносимым выбором:

Выбор x86, как правило, является наиболее безопасной конфигурацией для пакета приложения, поскольку он будет работать практически на каждом устройстве. На некоторых устройствах пакет приложения с конфигурацией x86 не запускается, например, Xbox или некоторые устройства IoT Core. Однако для ПК пакет x86 является самым безопасным выбором и обладает наибольшим охватом для развертывания устройства. Значительная часть устройств Windows 10 продолжает работать под управлением версии x86 для Windows.

Ответ 3

Вот краткий обзор, который объясняет различные цели сборки.

Исходя из моего собственного опыта, если вы хотите создать проект, который будет работать как на платформах x86, так и на платформах x64, и у вас нет какой-либо конкретной оптимизации для x64, я бы изменил сборку, чтобы специально сказать "x86".

Причина этого заключается в том, что иногда вы можете получить некоторые DLL, которые сталкиваются, или некоторый код, который приводит к сбою WOW в среде x64. Конкретно указав x86, ОС x64 будет рассматривать приложение как чистое приложение x86 и следить за тем, чтобы все работало гладко.

Ответ 4

Просмотрите статью Обозначение цели платформы Visual Studio.NET.

Значение по умолчанию "Любой процессор" означает, что сборка будет запущена изначально на CPU, в котором он запущен. Смысл, он будет работать как 64-разрядная версия на 64-битной машине и 32-разрядная на 32-разрядной машине. Если сборка вызывается из 64-битного приложения, она будет выполняться как 64-битная сборка и т.д.

Сообщается, что указанная ссылка была нарушена, так что вот еще одна статья с аналогичным объяснением: Что AnyCPU действительно имеет значение с .NET 4.5 и Visual Studio 11

Ответ 5

"Любой процессор" означает, что при запуске программы .NET Framework будет определять на основе битов ОС, запускать ли вашу программу в 32 бита или 64 бита.

Существует разница между x86 и Any CPU: в системе x64 исполняемый файл, скомпилированный для X86, будет выполняться как 32-разрядный исполняемый файл.

Что касается ваших подозрений, просто зайдите в командную строку Visual Studio 2008 и запустите следующее.

dumpbin YourProgram.exe /headers

Он расскажет вам о битте вашей программы, а также о многом.

Ответ 6

Любой процессор означает, что он будет работать на любой платформе. Это связано с тем, что управляемый код похож на Java. Подумайте об этом как о компиляции в байтовый код, который интерпретируется платформой .NET Framework во время выполнения.

У С++ этот параметр отсутствует, поскольку он скомпилирован для машинного кода, специфичного для платформы.

Ответ 8

Я рекомендую прочитать сообщение .

При использовании AnyCPU семантика такова:

  • Если процесс выполняется в 32-разрядной системе Windows, он работает как 32-разрядный процесс. IL компилируется в машинный код x86.
  • Если процесс выполняется в 64-разрядной системе Windows, он работает как 32-разрядный процесс. IL компилируется в машинный код x86.
  • Если процесс выполняется в системе ARM Windows, он работает как 32-разрядный процесс. IL компилируется в машинный код ARM.