Яка мета налаштування «Віддайте перевагу 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 та anycpu32bitferferred ). При використанні аромату «Віддати перевагу 32-бітовому» AnyCPU семантика така:

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

Відмінність між "будь-яким 32-бітним процесором, який віддав перевагу процесору" та "x86" полягає лише в цьому: програма .NET, компільована до x86, не працюватиме в системі Windows ARM, але додаток "Будь-який 32-бітний процесор, який бажаний" буде успішно працювати.


12
+1. Крім того, прапорець "Віддати перевагу 32-розрядному" увімкнено лише для виконуваних проектів .NET 4.5+.
Лі Гріссом

12
Ще одна перевага anycpu32bitsferferred полягає в тому, що інший .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-бітного процесора.
Nic

6

Ось проста відповідь:

Арка додатків

Примітка: AnyCPU-32bitPreferred доступний лише у .Net версії 4.5 та вище.


2
Яка різниця між "працює як 32-бітний" проти запускається як "WoW64". Я думав, WoW64 = "Windows (32-розрядна) в Windows64", і мені було потрібно для запуску будь-якого 32-бітного додатка.
Пітер Кордес

Чи є джерело для цього? Здається, скрізь все ще мені кажуть, що за замовчуванням є anycpu32bitferfer, що є величезною різницею для людей, які працюють на 64-бітних машинах Windows (це багато).
Ран

@RanSagy ви можете просто протестувати його, створивши новий проект і перевіривши Project -> Properties -> Build tab -> Platform target... але зауважте, що AnyCPU-32bitPreferredвін доступний лише у .Net версії 4.5 і новішої версії. Ось чому за замовчуванням є AnyCPU.
Yousha Aleayoub

У деяких випадках міна була сірою; Я просто сподівався, що є якась документація про те, що відбувається в .net 4.5+ або .net стандарт / core (або насправді, MSBuild 16)
Ran

-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.