Как заставить приложение.NET работать в 32-битном режиме
Я пытаюсь запустить приложение.NET 3.5 WinForms на Win7 x64. Приложение использует NHibernate и System.Data.OracleClient для доступа к базе данных Oracle. Клиент Oracle 32-битный.
При запуске приложения я получаю следующее сообщение об ошибке
Попытка загрузить клиентские библиотеки Oracle вызвала исключение BadImageFormatException. Эта проблема возникает при работе в 64-битном режиме с установленными 32-битными клиентскими компонентами Oracle.
В ответ на это я нацелил свою сборку на платформу x86:
К моему удивлению, то же самое сообщение об ошибке появилось при попытке выполнить эту новую сборку на платформе Win7.
Сборка NHibernate загружается во время выполнения Assembly.Load("...");
,
Возможно ли, что библиотека NHibernate по-прежнему работает в 64-битном режиме, в то время как исполняемый файл хоста работает в 32-битном режиме. Это звучит странно для меня. Или может быть так, что по какой-то причине мое приложение работает в 64-битном режиме, даже если оно предназначено для x86?
Обновить:
Я проверил свой двоичный файл с помощью CorFlags, и он помечен как 32-битный:
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1
Copyright (c) Microsoft Corporation. All rights reserved.
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 3
ILONLY : 1
32BIT : 1
Signed : 0
Я также проверил это в диспетчере задач, и он имеет *32
суффикс.
Я также попробовал и использовал CorFlags, чтобы добавить 32-битный флаг ко всем сборкам, которые поставляются с моим приложением. Это все еще выдает то же самое сообщение об ошибке.
Я озадачен... озадачен... озадачен...
6 ответов
32-разрядные процессы не могут загружать 64-разрядные библиотеки DLL и наоборот (подробности см. В этом разделе). Это означает, что если ваш процесс успешно загрузил 64-битную DLL, то это, безусловно, 64-битный процесс. Вы можете проверить это в диспетчере задач (как предложил Лассе) или с помощью других средств, описанных здесь. В этой статье также есть больше информации о.Net в Windows x64.
Правильно, похоже, что сборка NHibernate построена с AnyCPU
в качестве целевой платформы. Вам понадобится сборка NHibernate, специально созданная для x86.
Вы можете попробовать RunAsx86
Я использую этот инструмент для запуска приложений.NET в режиме x86, когда запускаю их из командной строки.
Я столкнулся с подобной проблемой раньше. У меня есть служба Windows, использующая Crystal Reports, на моей 64-битной машине все было нормально, я все настроил - проект был построен с использованием архитектуры x86.
Проблема возникла при развертывании на другом компьютере, сбой службы из-за невозможности загрузки ядра Crystal Reports log4net.dll 1.2.10
сборка. Я проверил каталог - версия там была 1.2.11
, мой локальный каталог содержал ту же версию. bindingRedirect
не работал.
Затем я проверил GAC - DLL-библиотеки CR подписаны и были добавлены в GAC установщиком, log4net 1.2.10
был там но архитектура процессора не была x86
, После добавления log4net 1.2.10
за x86
Архитектура это работало как шарм.
В случае, если это кому-нибудь поможет, у меня были те же симптомы с Oracle 64-битной и Windows 7 64-битной. Я оставил цель платформы в покое (не изменил никаких настроек проекта). Вместо этого я просто установил 32-битный Oracle, и это решило проблему. Обязательно обновите переменные среды (например, ORACLE_HOME, PATH), чтобы они указывали на 32-разрядную версию.
У меня та же ошибка в моем приложении C++ oracle, которое мне нужно запустить на 64-битной машине на 32-битной машине. ошибка плохого изображения происходит из-за смешивания 32-битных и 64-битных библиотек, поэтому я использовал средство обхода зависимостей, чтобы найти, какие библиотеки смешаны. В этом приложении я обнаружил, что oci.dll 64-битные, так как я установил Oracle-клиент 64-битных, но все остальные библиотеки 32-битных. поэтому я установил клиент Oracle для 32-разрядных на 64-разрядной машине и решил эту ошибку.