BadImageFormatException. Это произойдет при работе в 64-битном режиме с установленными 32-битными клиентскими компонентами Oracle.

Я получаю эту ошибку в то время как из моего .Net приложение пытается установить соединение с базой данных oracle.

Ошибка говорит о том, что This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed., Но я много раз убедился, что клиент установлен в x64 немного не 32,

Date Time: 6/8/2014 10:57:55 AM: System.InvalidOperationException: Attempt to load Oracle client libraries threw BadImageFormatException.  This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
       at System.Data.Common.UnsafeNativeMethods.OCILobCopy2(IntPtr svchp, IntPtr errhp, IntPtr dst_locp, IntPtr src_locp, UInt64 amount, UInt64 dst_offset, UInt64 src_offset)
       at System.Data.OracleClient.OCI.DetermineClientVersion()
       --- End of inner exception stack trace ---
       at System.Data.OracleClient.OCI.DetermineClientVersion()
       at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
       at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
       at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
       at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.OracleClient.OracleConnection.Open()
       at CustomizedSetupInstaller.Runscripts.InitializeDBObjects(String connectionString, String dbProvider)

22 ответа

Решение

Одно из решений состоит в том, чтобы установить на вашем компьютере клиенты Oracle как x86 (32-bit), так и x64, тогда не имеет значения, на какой архитектуре работает ваше приложение.

Вот инструкция по установке клиента Oracle x86 и x64 на одну машину:

Допущения: Oracle Home называется OraClient11g_home1 Клиентская версия 11gR2

  • При необходимости удалите любой установленный клиент Oracle (см. Как удалить / полностью удалить Oracle 11g (клиент)? Если у вас возникли проблемы)

  • Загрузите и установите клиент Oracle x86, например, в C:\Oracle\11.2\Client_x86

  • Загрузите и установите клиент Oracle x64 в другую папку, например, в C:\Oracle\11.2\Client_x64

  • Откройте инструмент командной строки, перейдите в папку%WINDIR%\System32, обычно C:\Windows\System32 и создать символическую ссылку ora112 в папку C:\Oracle\11.2\Client_x64 (см. раздел команд ниже)

  • Перейдите в папку%WINDIR%\SysWOW64, обычно C:\Windows\SysWOW64 и создать символическую ссылку ora112 в папку C:\Oracle\11.2\Client_x86, (увидеть ниже)

  • Изменить PATH переменная окружения, заменить все записи, как C:\Oracle\11.2\Client_x86 а также C:\Oracle\11.2\Client_x64 от C:\Windows\System32\ora112 соответственно их \bin вложенная папка. Замечания: C:\Windows\SysWOW64\ora112 не должно быть в среде PATH.

  • При необходимости установите ваш ORACLE_HOME переменная среды для C:\Windows\System32\ora112

  • Откройте редактор реестра. Установить значение реестра HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME в C:\Windows\System32\ora112

  • Установить значение реестра HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME в C:\Windows\System32\ora112 (не C:\Windows\SysWOW64\ora112)

  • Вы сделали! Теперь вы можете использовать клиент Oracle x86 и x64 без проблем, то есть приложение x86 загрузит библиотеки x86, приложение x64 загрузит библиотеки x64 без каких-либо изменений в вашей системе.

  • Вероятно, это мудрый вариант, чтобы установить TNS_ADMIN переменная окружения (соотв. TNS_ADMIN записи в реестре) к общему местоположению, например TNS_ADMIN=C:\Oracle\Common\network,

Команды для создания символических ссылок:

cd C:\Windows\System32 mklink /d ora112 C:\Oracle\11.2\Client_x64 cd C:\Windows\SysWOW64 mklink /d ora112 C:\Oracle\11.2\Client_x86

Заметки:

Обе символические ссылки должны иметь одинаковое имя, например ora112,

Несмотря на их имена папки C:\Windows\System32 содержит библиотеки x64, тогда как C:\Windows\SysWOW64 содержит библиотеки x86 (32-разрядные) Не смущайтесь.

У меня была такая же проблема на ПК с Windows 10. Я скопировал проект со своего старого компьютера на новый, оба 64-битных, и установил 64-битный Oracle Client на новом компьютере. Я получил то же сообщение об ошибке, но после попытки многих решений безрезультатно, что на самом деле у меня сработало: В вашей Visual Studio (у меня это 2017) перейдите в Инструменты> Параметры> Проекты и решения> Веб-проекты

На этой странице установите флажок "Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов".

В моей ситуации 32-битный клиент Oracle 11.2был установлен на моей 64-битной ОС Windows 2008 R2.

Мое решение: в расширенных настройках пула приложений, назначенных моему приложению ASP.NET, я установил для параметра Включить 32-разрядные приложения значение True.

Пожалуйста, смотрите ниже для автономного тестового сценария .ashx, который я использовал, чтобы проверить возможность подключения к Oracle. Перед изменением пула приложений его ответ был:

[Running as 64-bit] Connection failed.

... и после изменения пула приложений:

[Running as 32-bit] Connection succeeded.

TestOracle.ashx - скрипт для проверки соединения с Oracle через System.Data.OracleClient:

Использование: Измените пользователь, пароль и переменные хоста в зависимости от ситуации.

Обратите внимание, что этот сценарий можно использовать автономно, не нарушая файл проекта веб-приложения ASP.NET. Просто поместите его в папку вашего приложения.

<%@ WebHandler Language="C#" Class="Handler1" %>
<%@ Assembly Name="System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" %>

using System;
using System.Data.OracleClient;
using System.Web;

public class Handler1 : IHttpHandler
{
    private static readonly string m_User = "USER";
    private static readonly string m_Password = "PASSWORD";
    private static readonly string m_Host = "HOST";

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        string result = TestOracleConnection();
        context.Response.Write(result);
    }

    public bool IsReusable
    {
        get { return false; }
    }

    private string TestOracleConnection()
    {
        string result = IntPtr.Size == 8 ?
            "[Running as 64-bit]" : "[Running as 32-bit]";

        try
        {
            string connString = String.Format(
              "Data Source={0};Password={1};User ID={2};",
              m_Host, m_User, m_Password);

            OracleConnection oradb = new OracleConnection();
            oradb.ConnectionString = connString;
            oradb.Open();
            oradb.Close();
            result += " Connection succeeded.";
        }
        catch
        {
            result += " Connection failed.";
        }

        return result;
    }
}

Пересмотреть IIS

  1. Выберите Пулы приложений.
  2. Клик в ASP .NET V4.0 Classic.
  3. Выберите "Дополнительные настройки".
  4. В общем, опция Enable 32-Bit Applications, по умолчанию - false. Выберите ИСТИНА.
  5. Обновите и проверьте сайт.

Комментарий:

Платформа: Windows Server 2008 R2 Enterprise - 64-битная - IIS 7.5

У меня была такая же проблема, я исправил ее, изменив диспетчер конфигурации x86 -> x64 и построив

образ

Как было отмечено в комментариях, System.Data.OracleClient устарела. Существует мало причин, чтобы начать использовать его так поздно в игре.

Также, как отмечено в комментариях (я отметил это как вики сообщества в обзоре), теперь есть управляемый поставщик как часть 12c и более поздних версий пакета odp.net. Этот провайдер НЕ требует никаких неуправляемых dll, поэтому в этом случае это не проблема.

Если вы предпочитаете использовать старый неуправляемый поставщик Oracle.DataAccess из Oracle, самое простое решение - установить переменную конфигурации "DllPath":

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <oracle.dataaccess.client>
    <add key="DllPath"            value="C:\oracle\bin"/>
  </oracle.dataaccess.client>
</configuration>

См. "Порядок поиска для неуправляемых библиотек DLL" в http://docs.oracle.com/database/121/ODPNT/InstallODP.htm для получения дополнительной информации.

Это решение работает для меня,

Пересмотреть IIS

Select Application Pools.
Clic in ASP .NET V4.0 Classic.
Select Advanced Settings.
In General, option Enable 32-Bit Applications, default is false. Select TRUE.
Refresh and check site.

Комментарий:

Платформа: Windows Server 2012 Standard - 64-битная версия - IIS 8

У меня была такая же проблема в SSIS 2008. Я пытался подключиться к Oracle 11g, используя ODAC 12c 32 bit. Пробовал также установить ODAC 12c 64 bit. Служба SSIS действительно смогла просмотреть таблицу, но при попытке запустить пакет выдает это сообщение об ошибке. Ничего не помогло Перешел на VS 2013, теперь он работал в режиме отладки, но получил ту же ошибку при запуске пакета с именем файла dtexec /f. Тогда я нашел эту страницу: http://sqlmag.com/comment/reply/17881.

Для краткости написано: (если страница все еще там, просто перейдите на страницу и следуйте инструкциям...) 1) Загрузите и установите последнюю версию odac 64 bit xcopy с сайта oracle. 2) Загрузите и установите последнюю версию odac 32 bit xcopy с сайта oracle. Как? откройте оболочку cmd в качестве администратора и запустите: c:\64bitODACLocation> install.bat oledb c:\odac\odac64. Первый параметр - это компонент, который вы хотите установить. Второй параметр - это куда устанавливать. также установите версию 32: c:\32bitODACLocation> install.bat oledb c:\odac\odac32. 3) Измените путь к системе, включив в нее c:\odac\odac32; C: \ ODAC \odac32\ Bin; c:\odac\odac64;c:\odac\odac64\bin В ЭТОМ ЗАКАЗЕ. 4) Перезагрузите машину. 5) убедитесь, что у вас есть одинаковые tnsnames.ora в папках odac32\admin\network и odac64\admin\network (или хотя бы одна и та же запись для вашего соединения). 6) Теперь откройте SSIS в visual studio (я использовал бесплатную версию 2013 года с пакетом ssis). Используйте OLEDB, а затем выберите поставщика Oracle для поставщика OLE DB в качестве типа подключения. Установите имя записи в вашем tnsnames.ora как "имя сервера или файла". Имя пользователя - это имя вашей схемы (имя базы данных), а пароль - это пароль для схемы. вы сделали!

Опять же, вы можете найти очень подробное решение и многое другое на оригинальном сайте.

Это было единственное, что сработало для меня и не испортило мою среду.

Ура! ГКЛ

Сделайте для Enable32bit Application значение TRUE в пуле приложений IIS, который вы используете

Я хотел бы добавить резолюцию, которая работает для меня. Установка: Oracle 11g 64 бит работает на Windows 2008 R2 (64 бит ОС)

Клиент - это приложение.net Framework 3.5 (перенесено из 2.0), скомпилированное с настройкой платформы x86.

У меня была точно такая же проблема BadImageFormatException. Компиляция до 64 бит исключает исключение, но для меня это не вариант, так как мое приложение использует 32-битные компоненты activex, которые не работают в 64-битной версии.

Я решил эту проблему, загрузив Oracle Instant Client 11 (это всего лишь куча DLL, которую можно скопировать) с веб-сайта Oracle, и скопировав файлы в каталог файлов моего приложения. Смотрите здесь: http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf

Это решило проблему, из инструмента ProcMon я вижу, что локально скопированный файл oci.dll загружается System.Data.OracleClient и все в порядке.

Вероятно, это можно сделать, изменив настройки среды, как предложено выше, но этот метод имеет то преимущество, что не изменяет какие-либо настройки в конфигурации сервера.

У меня была эта ошибка в моем приложении DNN, установленном на Windows 2012 R2. Он использует 32-битную DLL и работает только Oracle.DataAccess.dll x32. Мое решение:

  1. Удалите старый клиент Oracle \ ODAC.
  2. Установите Oracle 11 Client x32.
  3. Установите Oracle ODAC 12 x64.
  4. Проверьте, что в пуле приложений IIS (классическая версия) есть параметр "Включить 32-разрядные приложения" = true.

Я разработал настольное приложение, используя C#.net с платформой 2.0 вместе с system.data.oracleclient для подключения oracle db, и я столкнулся с похожим сообщением об ошибке: "Попытка загрузить клиентские библиотеки Oracle вызвала BadImageFormatException. Эта проблема будет возникать при работе в 64-битном режиме с установленными 32-битными клиентскими компонентами Oracle."

были применены следующие решения

  • Проект, свойства, сборка TAB, выбор целевой платформы: x86
  • Проект, чистая сборка, решение ReBuild
  • Установите Oracle 11G*32-битный клиент

теперь, это работает, потому что приложение установлено для 32-битного и оракул 32-битного клиента, установленного на сервере Win2012 R2, надеюсь, будет работать для вас.

Пожалуйста, загрузите правильную версию Oracle Client, такую ​​как Oracle Client 11.2 32-Bit; который решил проблему для меня.

BadImageFormatException возникает, когда 32-битная (x86) dll вызывает 64-битную dll или наоборот. Если вы используете AnyCPU для вашего исполняемого файла записи, то при запуске на 64-битной машине он будет работать как 64-битный, однако, если тогда он вызовет 32-битную DLL, вы получите исключение, поэтому AnyCPU не всегда является ответом.

Я склонен строить все как 32-битный (x86), так как нам все еще приходится взаимодействовать со старыми компонентами, сделанными в VB6 (32-битный (x86)). В то время как производительность может быть выше для 64-битных машин, если нам важно обеспечить надежность AnyCPU для нас.

Я бы посоветовал попробовать собрать все ваши компоненты в 32-битной (x86), если вы не делаете действительно интенсивные вещи, я сомневаюсь, что это будет иметь большое значение.

У меня консольное приложение (оно должно работать и для Windows), и у меня была такая же проблема. Чтобы решить эту проблему, я использовал PlatformTarget как x64, так как мой System.Data.OracleClient.dll (64-битный файл) находится в C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5. Это будет явно использовать 64-битную версию Oracle Client. Это может помочь вам, если ваше решение работает только на 64-битных системах и если вы не используете 32-битные библиотеки DLL, такие как библиотеки, созданные в VB. Я надеюсь, что это поможет вам.

Я также получал ту же ошибку, я проверил, что моя система была в 64-битной, и я использовал oracle.DataAccess 32-битной версии Я добавил правильную 64-версию, теперь она получила разрешение ниже пути для ссылки на Oracle.DataAccess.dll

Правильный путь для 64-битной ОС C:\Oracle\11g_64\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll

Правильный путь для 32-битной ОС C:\Oracle\11g_32\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll

Как уже упоминалось в apc, ошибка возникает "когда 32-битная DLL вызывает 64-битную DLL или наоборот". Проблема в том, что если вы используете сборку с использованием AnyCPU и работаете в 64-битной среде, то приложение будет работать как 64-битное. Если явная перестройка для 32- и 64-разрядных версий невозможна, вы можете использовать утилиту Microsoft под названием corflags.exe, которая поставляется вместе с Windows SDK. По сути, вы можете изменить флаг в exe программы, которую вы выполняете, чтобы он работал как 32-битный, даже если среда является 64-битной.

Смотрите здесь для получения информации об использовании его

Та же проблема. У меня есть 64-разрядная версия Visual Studio 2022 и версия Oracle Instant Client версии 21.10.0.0.0.

Решено:

  1. Снимите флажок использовать 64-разрядную версию iis Express для веб-сайтов и проектов.

  2. Снимите флажок Предпочитать 32-разрядную версию .

Я получил эту проблему для консольного приложения. В моем случае я просто изменил Target Platform на "Любой ЦП", который вы можете увидеть, если щелкнуть правой кнопкой мыши свое решение и щелкнуть свойства, вы увидите вкладку "Build", нажмите на нее, и вы увидите "Platform target:" изменить его на "Любой процессор", который решит вашу проблему

Для ssis 2008 просто активный 32-битный запуск, ниже Изображение (щелкните по этой ссылке)Orcale ssis 2008 г

Убедитесь, что реестр HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\4.112.# Ключ DIIPath указывает на 32-битный каталог BIN клиента Oarcle. Например, значение DIIPath может быть C:\app\ имя_пользователя \11.2.0\client_32bit\bin

Просто создайте свой код в режиме x86, а не в AnyCpu.

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