Как заставить приложение.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-разрядной машине и решил эту ошибку.

Другие вопросы по тегам