Как заставить приложение .NET работать в 32-битном режиме - PullRequest
10 голосов
/ 29 июня 2011

Я пытаюсь запустить приложение .NET 3.5 WinForms на Win7 x64.Приложение использует NHibernate и System.Data.OracleClient для доступа к базе данных Oracle.Клиент Oracle является 32-разрядным.

При запуске приложения я получаю следующее сообщение об ошибке

Попытка загрузить клиентские библиотеки Oracle вызвала исключение BadImageFormatException.Эта проблема возникает при работе в 64-битном режиме с установленными 32-битными клиентскими компонентами Oracle.

В ответ на это я настроил сборку на платформу x86:

Screenshot of the Build settings

К моему удивлению, то же самое сообщение об ошибке появилось при попытке выполнить эту новую сборку на платформе 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 ]

6 голосов
/ 30 июня 2011

32-разрядные процессы не могут загружать 64-разрядные библиотеки DLL и наоборот (подробности см. this ). Это означает, что если ваш процесс успешно загрузил 64-битную DLL, то это, безусловно, 64-битный процесс. Вы можете проверить это в диспетчере задач (как предложил Лассе) или с помощью других средств, описанных здесь . В этой статье также есть больше информации о .Net в Windows x64.

3 голосов
/ 29 июня 2011

Правильно, похоже, что сборка NHibernate построена с AnyCPU в качестве целевой платформы. Вам понадобится сборка NHibernate, специально созданная для x86.

2 голосов
/ 06 июля 2013

Вы можете попробовать RunAsx86

Я использую этот инструмент для запуска приложений .NET в режиме x86 при запуске их из командной строки.

0 голосов
/ 07 марта 2014

У меня та же ошибка в моем приложении c ++ oracle, которое мне нужно запустить на 64-битной машине на 32-битной машине. ошибка плохого образа происходит из-за смешивания 32-битных и 64-битных библиотек, поэтому я использовал средство обхода зависимостей, чтобы найти, какие библиотеки смешаны. В этом приложении я обнаружил, что oci.dll 64-битные, так как я установил Oracle-клиент 64-битных, но все остальные библиотеки 32-битных. поэтому я установил клиент Oracle для 32-разрядных на 64-разрядной машине и решил эту ошибку.

0 голосов
/ 18 февраля 2014

Я сталкивался с подобной проблемой раньше.У меня есть служба Windows, использующая Crystal Reports, на моей 64-битной машине все было в порядке, я все настроил - проект был построен с использованием архитектуры x86.

Проблема возникла, когда при развертывании на другом компьютере произошел сбой службы, поскольку ядро ​​Crystal Reports не смогло загрузить сборку log4net.dll 1.2.10.Я проверил каталог - версия была 1.2.11, мой локальный каталог содержал ту же версию.bindingRedirect не работал.

Затем я проверил GAC - библиотеки DLL подписаны и были добавлены в GAC установщиком, log4net 1.2.10 был там, но архитектура процессора не была x86.После добавления архитектуры log4net 1.2.10 для x86 она работала как шарм.

0 голосов
/ 07 июня 2012

В случае, если это кому-нибудь поможет, у меня были те же симптомы с Oracle 64-битной и Windows 7 64-битной.Я оставил цель платформы в покое (не изменил никаких настроек проекта).Вместо этого я просто установил 32-битный Oracle, и это решило проблему.Обязательно обновите переменные среды (например, ORACLE_HOME, PATH), чтобы они указывали на 32-разрядную версию.

...