Любой процессор - Предпочитаете 32 бит

Что делает любой процессор - предпочитает 32-битный вариант?

Хотя мне известно, что WinRT не может работать с exe и может работать только с приложениями Windows Store, есть несколько вопросов существуют на qaru.site/info/43183/..., которые задают один и тот же вопрос, и оба ссылаются на этот blog, который гласит:

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

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

Однако после покупки моей Surface RT я создал программу Hello World, установил ее в Any CPU, проверил флаг Prefer 32 Bit, скомпилировал и скопировал ее на мою Surface. Когда я запускал программу, операционная система рассказала мне, что она не может запустить программу и что я должен смотреть на рынок, как и для любого x86/x64 exe. Точное отображаемое сообщение: "Это приложение не может работать на вашем ПК. Чтобы найти приложения для этого ПК, откройте" Магазин Windows ".

Итак, что это на самом деле делает и можно ли скомпилировать любое приложение CPU для Window RT на ARM?

Ответ 1

Основываясь исключительно на указанной вами цитате, она предполагает, что это означает следующее:

  • Если процессор поддерживает 32-битную обработку, то окончательный машинный код будет 32-битным (ARM или x86, не имеет значения).

  • Если нет, тогда машинный код будет 64-битным.

В старые времена AnyCPU означало "я агностик платформы". Это обычно означало, что вы получите 64-битные на 64-битных платформах и 32-разрядные в противном случае.

Однако есть причины, по которым вам может понадобиться 32-разрядная версия даже на 64-битном процессоре: указатели имеют половину размера, поэтому вы используете меньше памяти; код меньше, поэтому он больше вписывается в кеш и т.д. Но не было никакого способа заставить CLR использовать 32-битную и по-прежнему сохранять 64-бит в тех случаях, когда это было необходимо.

Теперь, когда AnyCPU - желательно 32 бит, вы можете получить свой торт (при необходимости 64-бит) и съесть его (возможно 32-битная поддержка)

Примечание. Если я не ошибаюсь, Itanium будет платформой, которая поддерживает только 64-битный, а не 32-разрядный код. Там могут быть или не быть другие.

Отказ от ответственности: я не эксперт, это просто из разных сообщений в блогах, которые я читал за последние 6 месяцев или около того

Ответ 2

Windows RT требует, чтобы файлы exe подписывались для его запуска. Но если вы джейлбрейк вашего RT, то он может запустить exe файл любой, если он поддерживается в Windows на ARM (.NET или родные приложения ARM)

Подробнее об этой опции в Что AnyCPU действительно имеет значение с .NET 4.5 и Visual Studio 11