2009-02-05 5 views
404

У меня есть путаница, связанная с возможностями построения платформы .NET в Visual Studio 2008.Что означает цель Visual Studio «Любой процессор»?

Что такое цель компиляции «Любой процессор» и какие файлы она генерирует? Я рассмотрел выходной исполняемый файл этой сборки «Any CPU» и обнаружил, что они являются исполняемыми файлами x86 (кто не увидит этого!). Итак, есть ли разница между таргетингом исполняемого файла на x86 и «Any CPU»?

Другое, что я заметил, это то, что управляемые проекты на C++ не имеют этой платформы в качестве опции. Почему это? Означает ли это, что мои подозрения в том, что исполняемые файлы «Любой процессор» являются простыми 32-битными?

+4

Еще одна вещь, чтобы рассмотреть при выборе платформы целевого использования: если цель * проекта Автозагрузка * является 'Любой CPU' и вы на 64 стереосистеме и обновите битных ОС, вы теряете способность к * Отредактируйте и продолжите * во время отладки. (Вы эффективно отлаживаете 64-битный процесс). Вы можете сделать * Startup project * target 'x86', чтобы обойти это во время отладки. (Сборки, на которые ссылается проект запуска, могут продолжать мигать «Любой процессор». –

+8

@CristiDiaconescu С VS2013 Теперь можно редактировать и продолжить – ms007

ответ

317

AnyCPU сборка будет JIT до 64-битного кода при загрузке в 64-битный процесс и 32 бит при загрузке в 32-битный процесс.

Ограничивая процессор, вы бы сказали: Есть что-то, что используется сборкой (что-то, вероятно, неуправляемое), которое требует 32 бит или 64 бит.

+2

, так как я могу создать сборку, которая будет JIT для x64 в C++? – galets

+40

Проекты на C++ компилируются в родной код, поэтому компилятор JIT не участвует ... таким образом, вы не можете делать то, что вы просите. – cplotts

+7

@cplotts: поскольку @galets задал этот вопрос 3 месяца назад, вряд ли он увидит ваш ответ. Используйте @galets префикс в вашем комментарии, подобный тому, как у меня здесь, чтобы он получил предупреждение о вашем ответе. – AnthonyWJones

50

Вот quick overview, который объясняет различные цели сборки.

Из моего собственного опыта, если вы хотите создать проект, который будет работать как на x86, так и на x64-приложениях, и у вас нет каких-либо конкретных оптимизаций x64, я бы изменил сборку, чтобы сказать «x86 «.

Причина в том, что иногда вы можете получить некоторые DLL-файлы, которые сталкиваются или какой-то код, который заканчивается сбоем WOW в среде x64. Специально указав x86, ОС x64 будет рассматривать приложение как чистую x86-приложение и убедитесь, что все работает плавно.

+27

Что может быть ужасно, если вы пишете для серверной среды и хотите, чтобы ваше приложение могло использовать больше затем 2 ГБ памяти. Вы также отказываетесь от любых x64 оптимизаций JIT, которые могут когда-нибудь спуститься по трубе. –

39

«Любой процессор» означает, что при запуске программы .NET Framework будет определять, исходя из битовой OS-совместимости, независимо от того, запускать ли вы программу в 32 бита или 64 бит.

Существует разница между x86 и Любой CPU: на x64 системе, исполняемый скомпилирован для X86 будет работать в качестве 32-битного исполняемого файла.

Что касается ваших подозрений, просто зайдите в Visual Studio   Studio 2008 и запустите следующее.

dumpbin YourProgram.exe /headers 

Он расскажет вам о болоте вашей программы, а также о многом другом.

+6

Если он построен в «любом процессоре», он будет отображаться как 32 бит в заголовках самосвала. – Kirbinator

43

Просмотрите статью Visual Studio .NET Platform Target Explained.

Значение по умолчанию «Любой процессор» означает, что сборка будет запускаться изначально на CPU, в котором он запущен. Смысл, он будет запускать как 64-разрядный бит на 64-битной машине и 32-битный на 32-битной машине. Если сборка вызывается из 64-битного приложения, она будет выполняться как 64-битная сборка и так далее.

выше ссылку, как сообщается, будет нарушена, так вот еще одна статья с подобным объяснением: What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

+0

Ссылка сейчас на припаркованный домен. –

+0

Я добавил ссылку на вторую статью с аналогичной информацией. Я оставил первую ссылку в случае, если домен снова активирован. – NYSystemsAnalyst

31

Любой процессор означает, что он будет работать на любой платформе. Это связано с тем, что управляемый код похож на Java. Подумайте об этом как о компиляции в байтовый код, который интерпретируется платформой .NET Framework во время выполнения.

У C++ этот параметр отсутствует, поскольку он скомпилирован в машинный код, специфичный для платформы.

+10

+1 для ответа на одну часть вопроса, которую никто другой не делал (о проектах на C++, не имеющих AnyCPU в качестве опции). – cplotts

250

Я думаю, что большинство важных вещей, что было сказано, но я просто думал, что я хотел бы добавить одну вещь
если вы собираете, как Любой процессор и работать на платформе x64, то вы не сможете загрузить 32-разрядные DLL, потому что ваше приложение не было запущено в WOW64, но эти DLL должны запускаться там.
Если вы скомпилируете как x86, тогда система x64 запустит ваше приложение в WOW64, и вы сможете загрузить 32-разрядные DLL-файлы.
Поэтому я думаю, что вы должны выбрать «Любой процессор», если ваши зависимости могут выполняться в любой среде, но выберите x86, если у вас есть 32-разрядные зависимости. Эта статья от Microsoft объясняет это немного:

/CLRIMAGETYPE (Specify Type of CLR Image)

+5

приятное добавление !!!! –

+2

Возможно, вы можете отредактировать свой ответ, чтобы сказать, как можно определить, является ли данная DLL 32-разрядной. Насколько мне известно, [это] (http://stackoverflow.com/a/2418287/848344) должно понять это. Я думаю, мы надеемся на DLL, которые также являются «Any CPU», а не только x86. –

+0

+1 важное различие. Требовалось использовать 32-разрядную зависимость (которая не была идентифицирована как таковая). Не удалось выяснить критические сообщения об ошибках времени выполнения. По привычке изменил цель процессора, и он сработал, но пошел искать «почему». Будет приятно когда-нибудь, когда все будет 64 бит, и проблемы несовместимости будут казаться странными, как 16-битная и 32-битная. –

1

Я рекомендую прочитать эту post.

При использовании AnyCPU семантика заключается в следующем:

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

Только в том случае, если выбрано значение «Предпочесть 32-бит». –

+0

Это значение по умолчанию, так как Visual Studio 11 – Moerwald

 Смежные вопросы

  • Нет связанных вопросов^_^