Что означает цель Visual Studio «Any CPU»? - PullRequest
462 голосов
/ 05 февраля 2009

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

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

Еще одна вещь, которую я заметил, это то, что в управляемых проектах C ++ эта платформа не предусмотрена в качестве опции. Это почему? Означает ли это, что мое подозрение о том, что исполняемые файлы «Any CPU» являются простыми 32-разрядными, верно?

Ответы [ 8 ]

363 голосов
/ 05 февраля 2009

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

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

297 голосов
/ 23 января 2010

Я думаю, что большинство важных вещей было сказано, но я просто решил добавить одну вещь: если вы компилируете как Любой процессор и работаете на платформе 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 Окна.

50 голосов
/ 05 февраля 2009

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

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

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

45 голосов
/ 05 февраля 2009

Ознакомьтесь со статьей Объяснение цели платформы Visual Studio .NET .

Настройка по умолчанию «Любой ЦП» означает, что сборка будет запущена. изначально на процессоре, на котором он сейчас работает. Смысл, это будет работать как 64-разрядный на 64-разрядном компьютере и 32-разрядный на 32-разрядном компьютере. Если сборка вызывается из 64-битного приложения, она будет работать как 64-битная сборка и т. Д.

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

39 голосов
/ 05 февраля 2009

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

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

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

dumpbin YourProgram.exe /headers

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

33 голосов
/ 20 января 2017

Кредит на книгу "CLR via C #", смотрите здесь:

https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38

enter image description here

31 голосов
/ 05 февраля 2009

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

C ++ не имеет этой опции, потому что он скомпилирован в машинный код, который зависит от платформы.

4 голосов
/ 07 июля 2017

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

При использовании AnyCPU семантика следующая:

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