С# компиляция для 32/64 бит, или для любого ppd

Этот вопрос относится к предыдущему вопросу о SO

Любой вопрос с процессором 1 и Любой вопрос с процессором 2

У меня есть приложение, которое изначально было построено на Win XP с помощью Visual Studio 2005 (не смейтесь!). Это приложение вызывает нашу dll win32 С++. Компоненты С#, которые вызывают библиотеки С++, были построены с конфигурацией "Любой процессор" и успешно работали над Win XP без каких-либо проблем.

Теперь мы переходим к Win 7, и выпускная версия нашего приложения (которая была построена на Win XP с VC 2005) отлично работает. Однако с выходом из выигрыша 7 нашим пользователям мы теперь взяли opputunity для перехода на VS 2010, и я построил компоненты С# на win 7 с VC 2010, но теперь, когда я запускаю эту версию, я получаю много "неспособных загрузить abc. dll", где abc.dll - это наши компоненты win32 С++.

Я понимаю, что рекомпиляция сборки С# с конфигурацией x86 решит проблему, но я не понимаю, как сборка версии С#, созданная с помощью Win-XP/Visual studio 2005 (любая конфигурация процессора), может запускаться на Выиграть 7 без каких-либо проблем? Разумеется, эти сборки С#, построенные с помощью "Any CPU", должны иметь JIT-64-битный код при загрузке в Win 7 и вызывать BadImageFormatException или другие ошибки, поскольку они вызывают DLL файлы Win32 С++.


ОБНОВЛЕНИЕ: У меня есть дополнительная информация, которая была запрошена в комментариях ниже.

  • В окне Windows 7 я нажимаю правой кнопкой мыши на свой компьютер и просматриваю свойства. В Системной информации указано "Тип системы: 64-разрядная операционная система", подтверждающая, что это ОС Win64.

  • Открытие решения в VC2005 в Windows XP При просмотре диспетчера конфигурации для решения я могу подтвердить ВСЕ, проекты С# - это тип платформы "Любой процессор".

  • При запуске сборки релиза (которая была выполнена на VC2005/win xp) на 64-битной машине Win 7, диспетчер задач отображает имя изображения как "Test.exe * 32", это подтверждает, что это jit'd и загружается в 32-битный процесс.

Ответ 1

В Win7 процесс 64-разрядный. В 64-битных процессах не может быть 32-разрядных DLL файлов, что довольно фундаментальное ограничение для Windows.

И тот факт, что этот управляемый код EXE вызывает в 32-разрядную DLL, не является очевидным из get-go-P/Invoke, а также для COM-взаимодействия, работает через позднюю привязку. Таким образом, EXE загружен, загрузчик не проверяет зависимости - с одной стороны, зависимости могут быть условными - тогда наступает время загрузки DLL, происходит wackiness.

Итак, если вы управляете кодом с известными 32-разрядными зависимостями, лучше указать 32-битный процессор во время компиляции. Или перекомпилируйте части С++ на 64 бита, это также опция.

Ответ 2

Я могу подтвердить, что вы должны получить BadImageFormatException. Возможно ли, что компиляция на XP была обезглавлена ​​с достаточной степенью вероятности, что она фактически не создала AnyCPU, а скорее строит x86, помеченную как AnyCPU. Я также могу подтвердить, что обезьяна с файлом проекта может быть достаточно плохой, чтобы она это делала, и компонент обновления проекта дросселирует это.

Ответ 3

Одно из возможных объяснений заключается в том, что один из ваших проектов в решении в 32-битной системе разработки имел двоичную ссылку на 32-битную сборку, которая заставила бы ее загружаться как 32-разрядный процесс даже на 64- разрядных систем.