it-swarm.com.de

BadImageFormatException. Dies tritt auf, wenn im 64-Bit-Modus die 32-Bit-Oracle-Clientkomponenten installiert sind

Ich erhalte diese Fehlermeldung, während eine meiner .Net-Anwendungen versucht, eine Verbindung zur Oracle-Datenbank herzustellen.

Der Fehler besagt, dass This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.. Aber ich habe sichergestellt oft, dass der Client in x64-Bit nicht 32 installiert ist.

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)
26
Maven

Eine Lösung besteht darin, x86-Clients (32-Bit) und x64-Oracle-Clients auf Ihrem Computer zu installieren. Dabei spielt es keine Rolle, auf welcher Architektur Ihre Anwendung ausgeführt wird. 

Hier eine Anweisung, um den x86- und x64-Oracle-Client auf einem Computer zu installieren:

Annahmen: Oracle Home heißt OraClient11g_home1, Client-Version ist 11gR2

  • Entfernen Sie optional einen installierten Oracle-Client (siehe Deinstallieren/Entfernen von Oracle 11g (Client) vollständig? bei Problemen)

  • Laden Sie den Oracle x86-Client herunter und installieren Sie ihn, beispielsweise in C:\Oracle\11.2\Client_x86.

  • Laden Sie den Oracle x64-Client herunter und installieren Sie ihn in einem anderen Ordner, z. B. in C:\Oracle\11.2\Client_x64.

  • Öffnen Sie das Befehlszeilentool, öffnen Sie den Ordner% WINDIR%\System32 (normalerweise C:\Windows\System32) und erstellen Sie einen symbolischen Link ora112 zum Ordner C:\Oracle\11.2\Client_x64 (siehe den Abschnitt mit den Befehlen unten).

  • Wechseln Sie in den Ordner% WINDIR%\SysWOW64 (normalerweise C:\Windows\SysWOW64) und erstellen Sie einen symbolischen Link ora112 zum Ordner C:\Oracle\11.2\Client_x86 (siehe unten).

  • Ändern Sie die Umgebungsvariable PATH, ersetzen Sie alle Einträge wie C:\Oracle\11.2\Client_x86 und C:\Oracle\11.2\Client_x64 durch C:\Windows\System32\ora112 bzw. ihren \bin-Unterordner. Hinweis: C:\Windows\SysWOW64\ora112 darf nicht in der PATH-Umgebung sein.

  • Falls erforderlich, setzen Sie Ihre Oracle_HOME-Umgebungsvariable auf C:\Windows\System32\ora112.

  • Öffnen Sie Ihren Registrierungseditor. Setzen Sie den Registrierungswert HKLM\Software\Oracle\KEY_OraClient11g_home1\Oracle_HOME auf C:\Windows\System32\ora112.

  • Setzen Sie den Registrierungswert HKLM\Software\Wow6432Node\Oracle\KEY_OraClient11g_home1\Oracle_HOME auf C:\Windows\System32\ora112 (nicht C:\Windows\SysWOW64\ora112).

  • Du bist fertig! Jetzt können Sie den x86- und x64-Oracle-Client nahtlos zusammen verwenden, d. H., Eine x86-Anwendung lädt die x86-Bibliotheken. Eine x64-Anwendung lädt die x64-Bibliotheken ohne weitere Änderungen an Ihrem System.

  • Wahrscheinlich ist es eine sinnvolle Option, Ihre TNS_ADMIN-Umgebungsvariable (bzw. TNS_ADMIN-Einträge in der Registrierung) auf einen gemeinsamen Speicherort zu setzen, beispielsweise TNS_ADMIN=C:\Oracle\Common\network.

Befehle zum Erstellen symbolischer Links:

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

Anmerkungen: 

Beide symbolischen Links müssen denselben Namen haben, z. ora112

Trotz ihres Namensordners enthält C:\Windows\System32 die x64-Bibliotheken, wohingegen C:\Windows\SysWOW64 die x86-Bibliotheken (32-Bit) enthält. Sei nicht verwirrt.

43

In meiner Situation wurde der Oracle 11.2 32-Bit-Client _ ​​war auf meinem 64-Bit-Windows 2008 R2-Betriebssystem installiert.

Meine Lösung: In den erweiterten Einstellungen für den Application Pool, der meiner Anwendung ASP.NET zugewiesen ist, setze ich Enable 32-Bit Applications auf True.

Nachfolgend finden Sie das Standalone-Testskript .ashx, mit dem ich die Fähigkeit getestet habe, eine Verbindung zu Oracle herzustellen. Bevor der Anwendungspool geändert wurde, war seine Antwort:

[Running as 64-bit] Connection failed.

... und nach der Änderung des Anwendungspools:

[Running as 32-bit] Connection succeeded.

TestOracle.ashx - Skript zum Testen einer Oracle-Verbindung über System.Data.OracleClient:

Zur Verwendung: Ändern Sie die Benutzer-, Kennwort- und Hostvariablen entsprechend.

Beachten Sie, dass dieses Skript eigenständig verwendet werden kann, ohne die Projektdatei der ASP.NET-Webanwendung zu beeinträchtigen. Legen Sie es einfach in Ihrem Anwendungsordner ab.

<%@ 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;
    }
}
10
DavidRR

Ich hatte das gleiche Problem auf einem Windows 10-PC. Ich habe das Projekt von meinem alten Computer auf den neuen 64-Bit-Computer kopiert und den Oracle-Client 64-Bit auf dem neuen Computer installiert. Ich habe dieselbe Fehlermeldung erhalten, aber nachdem ich viele Lösungen ausprobiert hatte, funktionierte das für mich: In Ihrem Visual Studio (meines ist 2017) gehen Sie zu Tools> Optionen> Projekte und Lösungen> Web Projekte

Aktivieren Sie auf dieser Seite die Option mit der folgenden Option: Verwenden Sie die 64-Bit-Version von IIS Express für Websites und Projekte

6
Amir Tofighi

Zu überarbeiten IIS 

  1. Wählen Sie Anwendungspools aus.
  2. Klicken Sie auf ASP .NET V4.0 Classic.
  3. Wählen Sie Erweiterte Einstellungen.
  4. Im Allgemeinen ist die Option "32-Bit-Anwendungen aktivieren" auf "false" gesetzt. Wählen Sie TRUE.
  5. Aktualisieren und überprüfen Sie die Website.

Kommentar:

Plattform: Windows Server 2008 R2 Enterprise - 64Bit - IIS 7.5

2
javier maffla

Wie in den Kommentaren darauf hingewiesen wurde, ist System.Data.OracleClient veraltet. Es gibt keinen Grund, es so spät im Spiel einzusetzen.

Wie auch in den Kommentaren (ich habe dies als Community-Wiki in Beachtung markiert) darauf hingewiesen, gibt es nun einen verwalteten Anbieter als Teil von 12c und späteren Versionen des odp.net-Pakets. Dieser Anbieter benötigt KEINE nicht verwalteten DLLs, daher sollte dies in diesem Fall kein Problem sein.

Wenn Sie den alten, nicht verwalteten Oracle.DataAccess-Provider von Oracle bevorzugen, können Sie die Konfigurationsvariable "DllPath" am einfachsten einstellen:

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

Weitere Informationen finden Sie unter "Suchreihenfolge für nicht verwaltete DLLs" in http://docs.Oracle.com/database/121/ODPNT/InstallODP.htm

2
b_levitt

Ich hatte das gleiche Problem in SSIS 2008. Ich habe versucht, eine Verbindung zu einem Oracle 11g mit ODAC 12c 32 Bit herzustellen. Es wurde auch versucht, ODAC 12c 64 Bit zu installieren. SSIS konnte tatsächlich eine Vorschau der Tabelle anzeigen, gab jedoch beim Versuch, das Paket auszuführen, diese Fehlermeldung aus. Nichts hat geholfen. Auf VS 2013 umgestellt, lief es jetzt im Debug-Modus, erhielt jedoch die gleiche Fehlermeldung, wenn das Paket mit dtexec/f Dateiname ausgeführt wurde . Dann fand ich diese Seite: http: // sqlmag .com/comment/reply/17881 .

Um es kurz zu machen, heißt es: (Wenn die Seite noch vorhanden ist, gehen Sie einfach auf die Seite und befolgen Sie die Anweisungen ...) 1) Laden Sie die neueste Version von odac 64-Bit-xcopy von der Oracle-Site herunter und installieren Sie sie. 2) Laden Sie die neueste Version von odac 32-Bit-Xcopy von der Oracle-Site herunter und installieren Sie sie. Öffnen Sie eine Cmd-Shell ALS ADMINSTARTOR und führen Sie Folgendes aus: c:\64bitODACLocation> install.bat oledb c:\odac\odac64 . Der erste Parameter ist die Komponente, die Sie installieren möchten. Der zweite Parameter ist der Installationsort für . Installieren Sie auch die 32-Version wie folgt: c:\32bitODACLocation> install.bat oledb c:\odac\odac32 . 3) Ändern Sie den Pfad des Systems, um ihn aufzunehmen c:\odac\odac32; c:\odac\odac32\bin; c:\odac\odac64; c:\odac\odac64\bin IN DIESER AUFTRAG . 4) Starten Sie den Rechner neu . 5) Vergewissern Sie sich, dass Sie die gleichen tnsnames.ora in odac32\admin\network und odac64\admin\network ordner (oder zumindest derselbe Eintrag für Ihre Verbindung) . 6) Öffnen Sie nun SSIS in Visual Studio (ich habe die kostenlose 2013-Version mit dem ssis-Paket verwendet) - Verwenden Sie OLEDB und wählen Sie dann das Oracle aus Provider für den DB-Provider OLE als Verbindungstyp. Legen Sie den Namen des Eintrags in Ihrer tnsnames.ora als "Server- oder Dateiname" fest. Benutzername ist Ihr Schemaname (Datenbankname) und Kennwort ist das Kennwort für das Schema. du bist fertig!

Auch hier finden Sie die sehr detaillierte Lösung und vieles mehr auf der ursprünglichen Website.

Dies war das einzige, was für mich funktionierte und meine Umgebung nicht störte. 

Prost! Gcr

1
gcr

Ich entwickelte eine Desktopanwendung unter Verwendung von C # .net mit 2.0-Framework zusammen mit system.data.oracleclient für die Verbindung von Oracle db. Ich hatte eine ähnliche Fehlermeldung: "Der Versuch, Oracle-Clientbibliotheken zu laden, warf BadImageFormatException. Dieses Problem tritt bei der Ausführung im 64-Bit-Modus auf mit den 32-Bit-Oracle-Clientkomponenten installiert. "

folgende Lösungen wurden angewendet

  • Projekt, Eigenschaften, TAB erstellen, Plattformziel auswählen: x86 
  • Projekt, Clean Build, ReBuild-Lösung
  • Installieren Sie den Oracle 11G * 32-Bit-Client 

jetzt funktioniert es, weil die Anwendung für 32-Bit- und Oracle-32-Bit-Clients eingestellt ist, die über den Win2012 R2-Server installiert sind. Dies funktioniert hoffentlich für Sie.

1
QSS

Ich habe dieses Problem für eine Konsolenanwendung erhalten. In meinem Fall habe ich gerade das Plattformziel in "Beliebige CPU" geändert. Sie können dies sehen, wenn Sie mit der rechten Maustaste auf Ihre Lösung klicken und auf "Eigenschaften" klicken Daraufhin wird "Platform target:" in "Any CPU" angezeigt, wodurch das Problem behoben wird

0
user3559374

Ich möchte eine Auflösung hinzufügen, die für mich funktioniert hat. Setup: Oracle 11g 64-Bit unter Windows 2008 R2 (64-Bit-Betriebssystem)

Client ist eine .net Framework 3.5-Anwendung (von 2.0 portiert), die mit der x86-Plattformeinstellung kompiliert wurde.

Ich hatte genau dieselbe Ausgabe von BadImageFormatException. Das Kompilieren auf 64 Bit beseitigt die Ausnahme, aber es war keine Option für mich, da meine App 32 Bit ActiveX-Komponenten verwendet, die nicht in 64 Bit arbeiten.

Ich habe das Problem gelöst, indem ich Oracle Instant Client 11 (dies ist nur ein Haufen von DLL, das kopiert werden kann) von der Oracle-Website heruntergeladen und die Dateien in das Verzeichnis meiner Anwendungsdateien kopiert hat. Siehe hier: http://www.Oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf

Dies hat das Problem gelöst. Mit dem ProcMon-Tool kann ich sehen, dass die lokal kopierte oci.dll von System.Data.OracleClient geladen wird und alles in Ordnung ist.

Möglicherweise kann dies durch Ändern der oben vorgeschlagenen Umgebungseinstellungen erfolgen, diese Methode hat jedoch den Vorteil, dass keine Einstellungen in der Serverkonfiguration geändert werden.

0
Pascal

Dieser Fehler in meiner DNN-Anwendung wurde unter Windows 2012 R2 installiert. Es verwendet einige 32-Bit-DLL und nur Oracle.DataAccess.dll x32 hat funktioniert. Meine Lösung ist:

  1. Deinstallieren Sie den alten Oracle-Client\ODAC.
  2. Installieren Sie Oracle 11 Client x32.
  3. Installieren Sie Oracle ODAC 12 x64.
  4. Check IIS Application Pool (Classic-Version) hat die Option "Enable 32-Bit Applications" = true.
0
Mykola Boyko

Ich bekam auch den gleichen Fehler. Ich überprüfte, ob mein System in 64 Bit war und ich verwendete Oracle.DataAccess von 32 Bit

Richtiger Pfad für 64-Bit-OS- C:\Oracle\11g_64\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll

Richtiger Pfad für 32-Bit-OS- C:\Oracle\11g_32\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll

0
Ratnesh Sahu

diese Lösung funktioniert für mich,

IIS überarbeiten

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.

Kommentar:

Plattform: Windows Server 2012 Standard- 64 Bit - IIS 8

0
theozdemir

Meins ist die Konsolenanwendung (es sollte auch für die Windows-Anwendung funktionieren) und ich hatte das gleiche Problem ... Um das Problem zu lösen, habe ich PlatformTarget als x64 verwendet, da meine System.Data.OracleClient.dll (64-Bit-Datei) bei C ist :\Programme (x86)\Referenzassemblies\Microsoft\Framework.NETFramework\v4.5. Dies wird explizit die 64-Bit-Version von Oracle Client verwenden. Dies kann hilfreich sein, wenn Ihre Lösung nur mit 64-Bit arbeitet und Sie keine 32-Bit-DLLs wie in VB erstellte DLLs verwenden. Ich hoffe, es hilft Ihnen.

0
Vikas

Wie erwähnt, tritt dieser Fehler auf, "wenn eine 32-Bit-DLL eine 64-Bit-DLL aufruft oder umgekehrt". Das Problem ist, dass die Anwendung als 64-Bit ausgeführt wird, wenn Sie mit AnyCPU Build erstellt haben und in einer 64-Bit-Umgebung ausgeführt werden. Wenn das explizite Wiederherstellen für 32- und 64-Bit keine Option ist, können Sie ein Microsoft-Dienstprogramm namens corflags.exe verwenden, das mit dem Windows SDK geliefert wird. Grundsätzlich können Sie ein Flag im Exe des Programms, das Sie ausführen, so ändern, dass es als 32-Bit-Version ausgeführt wird, auch wenn die Umgebung 64-Bit ist.

hier für Informationen zur Verwendung

0
Tomás

Laden Sie die korrekte Version von Oracle Client herunter, z. B. Oracle Client 11.2 32-Bit. was das Problem für mich gelöst hat.

0
Raghu

BadImageFormatException tritt auf, wenn eine 32-Bit-DLL (x86) eine 64-Bit-DLL aufruft oder umgekehrt. Wenn Sie AnyCPU für Ihre ausführbare Eintragsdatei verwenden, wird diese bei Ausführung auf einem 64-Bit-Computer als 64-Bit ausgeführt. Wenn jedoch eine 32-Bit-DLL aufgerufen wird, erhalten Sie die Ausnahme, weshalb AnyCPU nicht immer die Antwort ist.

Ich neige dazu, alles als 32bit (x86) zu bauen, da wir noch mit einigen alten Komponenten in VB6 (32bit (x86)) arbeiten müssen. Die Leistung von 64-Bit-Computern ist möglicherweise besser, wenn die Zuverlässigkeit von AnyCPU für uns wichtiger ist.

Ich würde vorschlagen, dass Sie versuchen, alle Komponenten in 32-Bit (x86) zu bauen, es sei denn, Sie machen wirklich intensive Dinge.

0
apc