Подтвердить что ты не робот

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

Я получаю эту ошибку, пока приложение my .Net пытается подключиться к базе данных оракула. ​​

Ошибка говорит, что 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)
4b9b3361

Ответ 1

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

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

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

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

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

  • Загрузите и установите Oracle x64 Client в другую папку, например, в 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 среды PATH, замените все записи, такие как C:\Oracle\11.2\Client_x86 и C:\Oracle\11.2\Client_x64 на C:\Windows\System32\ora112, в соответствии с их 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 в реестре), например 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-разрядные). Не смущайтесь.

Ответ 2

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

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

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

[Running as 64-bit] Connection failed.

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

[Running as 32-bit] Connection succeeded.

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

Использовать: При необходимости измените параметры пользователя, пароля и хоста.

Обратите внимание, что этот script можно использовать автономно, не нарушая файл проекта веб-приложения 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;
    }
}

Ответ 3

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

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

Ответ 4

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

Также, как указано в комментариях (я отметил это как сообщество wiki в наблюдении), теперь есть управляемый поставщик как часть 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

Ответ 5

Чтобы пересмотреть IIS

  • Выберите пулы приложений.
  • Clic в ASP.NET V4.0 Classic.
  • Выберите "Дополнительные параметры".
  • В общем случае опция Включить 32-разрядные приложения по умолчанию - false. Выберите TRUE.
  • Обновить и проверить сайт.

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

Платформа: Windows Server 2008 R2 Enterprise - 64Bit - IIS 7.5

Ответ 6

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

Чтобы сделать это коротко, он говорит: (если страница все еще там, просто перейдите на страницу и следуйте инструкциям...) 1) Загрузите и установите последнюю версию 64-битного xcopy odac с сайта oracle. 2) Загрузите и установите последнюю версию 32-битного xcopy odac с сайта oracle. Как? откройте CMD-оболочку AS ADMINSTARTOR и запустите: 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 Provider для поставщика OLE DB в качестве вашего типа подключения. Задайте имя записи в tnsnames.ora как "имя сервера или файла". Имя пользователя - это имя вашей схемы (имя db), а пароль - пароль для схемы. вы закончили!

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

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

Ура! GCR

Ответ 7

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

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

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

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

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

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

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

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

Ответ 11

Я получил эту проблему для консольного приложения.

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

Ответ 12

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

Чтобы пересмотреть 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 - 64Bit - IIS 8

Ответ 13

Mine - это консольное приложение (оно должно работать и для приложения 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 файлы, подобные DLL файлам, сделанным в VB. Надеюсь, это поможет вам.

Ответ 14

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

Ответ 15

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

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

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

Ответ 16

У меня была эта ошибка в моем приложении 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.

Ответ 17

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

Ответ 18

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