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


204

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

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

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



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

Ответы:


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 ГБ).
Алексей Левенков
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.