С# компиляция для 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- разрядных систем.