У меня есть путаница, связанная с параметрами сборки платформы .NET в Visual Studio 2008.
Что такое цель компиляции "Any CPU" и какие файлы она генерирует? Я проверил выходной исполняемый файл этой сборки "Any CPU" и обнаружил, что это исполняемые файлы x86 (кто бы не ожидал этого!). Итак, есть ли разница между таргетингом исполняемого файла на x86 и «любым процессором»?
Еще одна вещь, которую я заметил, это то, что управляемые проекты C ++ не имеют этой платформы в качестве опции. Это почему? Означает ли это, что мое подозрение о том, что исполняемые файлы "Any CPU" являются простыми 32-разрядными, верно?
.net
visual-studio-2008
build
64-bit
Galets
источник
источник
Any CPU
и вы работаете на 64-битной ОС, вы теряете возможность редактировать и продолжать во время отладки. (Вы эффективно отлаживаете 64-битный процесс). Вы можете сделать целевой проект Startup,x86
чтобы обойти это во время отладки. (Сборки, на которые есть ссылки из стартового проекта, могут продолжать нацеливатьсяAny CPU
.x86
библиотекой, используемойAnyCPU
приложением, которое я должен был установить,Prefer 32-bit
чтобы избежать ошибки загрузки.Ответы:
AnyCPU сборки будет JIT до 64-битного кода при загрузке в 64-битный процесс и 32 бита при загрузке в 32-разрядный процесс.
Ограничивая процессор, вы бы сказали: сборка использует что-то (что, вероятно, неуправляемо), для чего требуется 32 или 64 бита.
источник
Я думаю, что большинство важных вещей было сказано, но я просто решил добавить одну вещь: если вы скомпилируете как Any CPU и работаете на платформе x64, то вы не сможете загружать 32-битные DLL-файлы, потому что ваше приложение не было запущено в WoW64 , но эти DLL-файлы должны запускаться там.
Если вы скомпилируете как x86, то система x64 запустит ваше приложение в WoW64, и вы сможете загружать 32-битные файлы DLL.
Поэтому я думаю, что вам следует выбрать «Любой процессор», если ваши зависимости могут работать в любой среде, но выбрать x86, если у вас есть 32-битные зависимости. Эта статья от Microsoft объясняет это немного:
/ CLRIMAGETYPE (указать тип изображения CLR)
Кстати, эта другая документация Microsoft соглашается с тем, что x86 обычно является более переносимым выбором:
источник
Вот краткий обзор, который объясняет различные цели сборки.
Исходя из моего собственного опыта, если вы хотите создать проект, который будет работать как на платформах x86, так и на платформах x64, и у вас нет каких-либо конкретных оптимизаций для x64, я бы изменил сборку, чтобы специально сказать «x86».
Причина этого заключается в том, что иногда вы можете получить некоторые DLL-файлы, которые сталкиваются, или некоторый код, который приводит к сбою WoW в среде x64. Конкретно указав x86, ОС x64 будет рассматривать приложение как чистое приложение x86 и следить за тем, чтобы все работало гладко.
источник
Прочтите статью Объяснение цели платформы Visual Studio .NET .
Сообщается, что вышеупомянутая ссылка не работает, поэтому есть еще одна статья с похожим объяснением: что на самом деле означает AnyCPU, начиная с .NET 4.5 и Visual Studio 11
источник
Кредит на книгу "CLR через C #" , смотрите это:
источник
«Любой ЦП» означает, что при запуске программы .NET Framework выяснит, исходя из разрядности ОС, следует ли запускать вашу программу в 32 или 64 битах.
Существует разница между x86 и любым процессором : в системе x64 ваш исполняемый файл, скомпилированный для X86, будет работать как 32-разрядный исполняемый файл.
Что касается ваших подозрений, просто перейдите в командную строку Visual Studio 2008 и выполните следующее.
Он расскажет вам о битности вашей программы, а также многое другое.
источник
Любой процессор означает, что он будет работать на любой платформе. Это потому, что управляемый код похож на Java. Думайте об этом как о скомпилированном байтовом коде, который интерпретируется .NET Framework во время выполнения.
C ++ не имеет этой опции, потому что он скомпилирован в машинный код, который зависит от платформы.
источник
Я рекомендую прочитать этот пост .
При использовании AnyCPU семантика следующая:
источник