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

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

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

4 ответа

Решение

Это так странно, что никто не ссылается на запись в блоге, что на самом деле означает 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-битный процессор". будет работать успешно

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

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

Когда у меня было выбрано 32-битное предпочтение, при запуске на нашем сервере он пытался использовать 32-битный драйвер БД вместо 64-битного, который мы установили, поэтому он не подключался к БД, когда мы его запускали, поэтому запросы были сбой из-за невозможности подключения.

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

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

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

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

Другие вопросы по тегам