Что означает цель Visual Studio "Any CPU"?
У меня есть некоторая путаница, связанная с параметрами сборки платформы.NET в Visual Studio 2008.
Что такое цель компиляции "Any CPU" и какие файлы она генерирует? Я проверил выходной исполняемый файл этой сборки "Любой процессор" и обнаружил, что это исполняемые файлы x86 (кто бы не ожидал этого!). Итак, есть ли разница между нацеливанием на исполняемый файл x86 и "любым процессором"?
Еще одна вещь, которую я заметил, это то, что управляемые проекты C++ не имеют этой платформы в качестве опции. Это почему? Означает ли это, что мое подозрение о том, что исполняемые файлы "Any CPU" являются простыми 32-разрядными, верно?
8 ответов
Сборка AnyCPU будет JIT к 64-битному коду при загрузке в 64-битный процесс и 32-битному при загрузке в 32-битный процесс.
Ограничивая процессор, вы бы сказали: сборка использует что-то (что, вероятно, неуправляемо), для чего требуется 32 или 64 бита.
Я думаю, что большинство важных вещей было сказано, но я просто решил добавить одну вещь: если вы компилируете как Any CPU и работаете на платформе x64, то вы не сможете загрузить 32-битные dll, потому что Ваше приложение не было запущено в WOW64, но эти библиотеки должны работать там.
Если вы скомпилируете как x86, то система x64 запустит ваше приложение в WOW64, и вы сможете загружать 32-битные библиотеки DLL.
Поэтому я думаю, что вам следует выбрать "Любой процессор", если ваши зависимости могут работать в любой среде, но выбрать x86, если у вас есть 32-битные зависимости. Эта статья от Microsoft объясняет это немного:
/ CLRIMAGETYPE (указать тип изображения CLR)
Кстати, эта другая документация Microsoft соглашается с тем, что x86 обычно является более переносимым выбором:
Выбор x86, как правило, является самой безопасной конфигурацией для пакета приложения, поскольку он будет работать практически на каждом устройстве. На некоторых устройствах не запускается пакет приложений с конфигурацией x86, например, Xbox или некоторые устройства IoT Core. Тем не менее, для ПК пакет x86 является наиболее безопасным и обладает наибольшим охватом для развертывания устройства. Значительная часть устройств с Windows 10 продолжает работать под управлением версии x86 для Windows.
Кредит на книгу "CLR via C#", смотрите здесь:
Вот краткий обзор, который объясняет различные цели сборки.
Исходя из моего собственного опыта, если вы хотите создать проект, который будет работать как на платформах x86, так и на платформах x64, и у вас нет каких-либо конкретных оптимизаций для x64, я бы изменил сборку, чтобы конкретно сказать "x86".
Причина этого в том, что иногда вы можете получить несколько DLL, которые сталкиваются, или код, который приводит к сбою WOW в среде x64. Конкретно указав x86, ОС x64 будет рассматривать приложение как чистое приложение x86 и следить за тем, чтобы все работало гладко.
Прочтите статью Объяснение цели платформы Visual Studio .NET.
Значение по умолчанию "Любой ЦП" означает, что сборка будет работать на том ЦП, на котором она в данный момент выполняется. Это означает, что он будет работать как 64-разрядный на 64-разрядном компьютере и 32-разрядный на 32-разрядном компьютере. Если сборка вызывается из 64-разрядного приложения, она будет работать как 64-разрядная сборка и т. Д.
Сообщается, что вышеупомянутая ссылка не работает, поэтому есть еще одна статья с похожим объяснением: что на самом деле означает Any CPU, начиная с.NET 4.5 и Visual Studio 11
"Любой ЦП" означает, что при запуске программы.NET Framework выяснит, исходя из разрядности ОС, следует ли запускать вашу программу в 32 или 64 битах.
Существует разница между x86 и любым процессором: в системе x64 ваш исполняемый файл, скомпилированный для X86, будет работать как 32-разрядный исполняемый файл.
Что касается ваших подозрений, просто перейдите в командную строку Visual Studio 2008 и выполните следующее.
dumpbin YourProgram.exe /headers
Он расскажет вам о битности вашей программы, а также многое другое.
Любой процессор означает, что он будет работать на любой платформе. Это потому, что управляемый код похож на Java. Думайте об этом как о скомпилированном байтовом коде, который интерпретируется.NET Framework во время выполнения.
C++ не имеет этой опции, потому что он скомпилирован в машинный код, который зависит от платформы.
Я рекомендую прочитать этот пост.
При использовании AnyCPU семантика следующая:
- Если процесс выполняется в 32-разрядной системе Windows, он выполняется как 32-разрядный процесс. IL скомпилирован в машинный код x86.
- Если процесс выполняется в 64-разрядной системе Windows, он выполняется как 32-разрядный процесс. IL скомпилирован в машинный код x86.
- Если процесс выполняется в системе ARM Windows, он выполняется как 32-разрядный процесс. IL скомпилирован в машинный код ARM.