Какова цель параметра «Предпочитать 32-разрядный» в Visual Studio и как он на самом деле работает?

204

Введите описание изображения здесь

Мне неясно, как компилятор автоматически узнает, что нужно для 64-битной компиляции, когда это необходимо. Как он узнает, когда он может уверенно нацеливаться на 32-битную версию?

Мне в основном интересно, как компилятор знает, на какую архитектуру ориентироваться при компиляции. Анализирует ли он код и принимает ли решение на основе того, что находит?

Аарон
источник
2
stackoverflow.com/questions/7508965/…
Марк Гравелл
Ах, спасибо. Не видел этого раньше. Мне все еще интересно, как компилятор автоматически узнает, на какую архитектуру нацеливаться. Любые идеи?
Аарон

Ответы:

219

У Microsoft есть запись в блоге, что на самом деле означает AnyCPU, начиная с .NET 4.5 и Visual Studio 11 :

В .NET 4.5 и Visual Studio 11 сыр был перемещен. По умолчанию для большинства проектов .NET снова используется AnyCPU, но теперь для AnyCPU имеется более одного значения. Существует дополнительный подтип AnyCPU, «Любой 32-битный процессор», который является новым по умолчанию (в общем, теперь есть пять опций для переключателя компилятора / платформы C #: x86, Itanium, x64, anycpu и anycpu32bitpreferred ). При использовании варианта «Предпочитать 32-разрядный» AnyCPU семантика выглядит следующим образом:

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

Таким образом, разница между «Любой 32-битный процессор предпочтительнее» и «x86» заключается только в следующем: приложение .NET, скомпилированное для x86, не будет работать в системе ARM Windows, но приложение «Любой 32-битный процессор». будет работать успешно

Лекс Ли
источник
12
+1. Кроме того, флажок «Предпочитать 32-разрядный» включен только для исполняемых проектов .NET 4.5+.
Ли Гриссом
12
Другим преимуществом anycpu32bitspreferred является то, что другой .exe, работающий в 64 битах, может загрузить эту сборку.
Бруно Мартинес
30
Лично я думаю, что это ужасно, что они установили это по умолчанию без настройки инструментов, чтобы отключить его. Хуже того, вы не можете искать его, так как не в файлах csproj, если не выключен! Возможно, это связано с несовместимостью Office Automation с CPUAny на компьютере с архитектурой x64, при этом большинство пользователей устанавливают 32-разрядную версию Office.
Дейв
6
@BrianDavidBerman есть, если вы установите false в 32, но предпочтительнее и установите x64 или Any CPU на 64-битной машине.
Лекс Ли
6
Разница между x86 и любым 32-битным ЦП предпочтительна в том, что в последнем случае на исполняемом файле устанавливается флаг большого адресного ПО. Это означает, что 32-разрядный процесс, работающий в 64-разрядной ОС, может использовать 2 ГБ памяти в режиме x86 и 4 ГБ памяти в любом предпочтительном режиме 32-разрядного ЦП.
Ник
6

Вот простой ответ:

Приложение арка.

Примечание. AnyCPU-32bitPreferred доступен только в .Net версии 4.5 и выше.

Юша Алеауб
источник
2
В чем разница между "работает как 32-битный" и работает как "WoW64". Я подумал, что WoW64 = «Windows (32-битная) на Windows64» и был необходим для запуска любого 32-битного приложения.
Питер Кордес
Есть ли источник этого? По-видимому, везде еще говорят, что по умолчанию используется anycpu32bitpreferred, что является огромным отличием для людей, работающих на 64-битных компьютерах с Windows (это очень много).
Ран Саги
@RanSagy вы можете просто протестировать его, создав новый проект и проверив Project -> Properties -> Build tab -> Platform target... но учтите, что AnyCPU-32bitPreferredон доступен только в .Net версии 4.5 и выше. Вот почему по умолчанию AnyCPU.
Юша Алеауб
В некоторых случаях мой был серым; Я просто надеялся, что есть какая-то документация о том, что происходит в .net 4.5+ или .net standard / core (или на самом деле, MSBuild 16)
Ran Sagy
-1

Причина в том, что если вы не хотите использовать больше памяти с 64-битными приложениями. Это означает, что если ваше приложение AnyCPU , вы хотите работать как 32-битный.

Чтобы добавить больше, настройка в Visual Studio нацелена на конкретный CLR:

Visual Studio устанавливает 32-разрядную версию CLR на компьютере с архитектурой x86, а также 32-разрядную версию и соответствующую 64-разрядную версию CLR на 64-разрядном компьютере с Windows. (Поскольку Visual Studio представляет собой 32-разрядное приложение, при установке в 64-разрядной системе оно работает под управлением WOW64.)

Пожалуйста, обратитесь к статье 64-битные приложения ( MSDN ).

Перу
источник
1
Я не уверен, что это точно. Как я понимаю, исполняемые файлы .NET независимо от 32 или 64 все еще ограничены примерно 2 ГБ на процесс.
JP Richardson
1
Отредактировал мой ответ. Но не уверен, что это то, что вы ищете :)
Перу
2
@Aaron, компилятор по существу устанавливает флаг для среды выполнения, чтобы решить, нормально ли загружать сборку (то есть сборку только для блоков x86, загружаемую в процесс x64) и как запустить процесс (для нового EXE) на основе флагов. Я считаю, что ИЛ одинаков для обоих вкусов.
Алексей Левенков
1
@JPRichardson Да, ты прав. Но в .net 4.5 у вас есть возможность увеличить размер. см. MSDN
Перу
40
@JPRichardson, ни 32-, ни 64-битный исполняемый файл .Net ограничены 2 ГБ на процесс - в первую очередь адресное пространство для процесса является ограничением уровня ОС (2/3 + ГБ для 32-битного процесса и намного больше для 64-битного), вторая даже 32-битная версия может используйте более 2 ГБ, если на исполняемом файле установлен флаг «LargeAddressAware». Единственные ограничения в 2 ГБ, которые я знаю, касаются размеров массива / выделения, которые ограничены диапазоном Int32 (около 2 ГБ).
Алексей Левенков