BadImageFormatException. Dies tritt auf, wenn im 64-Bit-Modus die 32-Bit-Oracle-Client-Komponenten installiert sind
Ich bin immer dieser Fehler während meiner .Net
Anwendung versuchen, eine Verbindung zu oracle-Datenbank.
Den Fehler sagt, dass This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
. Aber das habe ich sicher viele Male, dass der client installiert x64
bit nicht 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)
Kommentar zu dem Problem
Sie sind über
System.Daten.OracleClient
. Dieser namespace ist veraltet und wird in einer zukünftigen version entfernt .NET. Vielleicht sind Sie mit einem 32-bit-version? Es ist auch nicht Teil der Oracle-client, also, ob Sie eine 32-bit-oder 64-bit-Oracle-client irrelevant ist. Ideal, Sie sollten mit Oracle.DataAccess
(oder Oracle.ManagedDataAccess
) statt. Kleiner Fehler:
System.Daten.OracleClient
nur die Provider, es verwendet auch ein Oracle-Client muss mit der Architektur. Nur Oracle.ManagedDataAccess
benötigt keine zusätzliche Oracle-client installiert ist. Vielleicht ist der Oracle Client x64, aber Ihre Anwendung ist 32-bit, funktioniert auch nicht. Es ist möglich, die Installation von 32-bit-und 64-bit-Oracle-client auf der gleichen Maschine InformationsquelleAutor der Frage Maven | 2014-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
One-Lösung ist die Installation sowohl für x86 (32-bit) und x64 Oracle-Clients auf Ihrem Rechner haben, dann ist es egal, auf welcher Architektur die Anwendung ausgeführt wird.
Hier eine Anleitung zum installieren von x86 und x64 Oracle client auf einer Maschine:
Annahmen: Oracle Home heißt
OraClient11g_home1
-, Client-Version 11gR2Optional entfernen Sie alle installierten Oracle-client
Herunterladen und installieren Oracle x86 Client, zum Beispiel in
C:\Oracle\11.2\Client_x86
Herunterladen und installieren Oracle-x64 Client in verschiedene Ordner, zum Beispiel zu
C:\Oracle\11.2\Client_x64
Öffnen Kommandozeilen-tool, gehen Sie zum Ordner %WINDIR%\System32, in der Regel
C:\Windows\System32
und erstellen Sie einen symbolischen linkora112
OrdnerC:\Oracle\11.2\Client_x64
(siehe Befehle weiter unten)Wechseln Sie zum Ordner %WINDIR%\SysWOW64, in der Regel
C:\Windows\SysWOW64
und erstellen Sie einen symbolischen linkora112
OrdnerC:\Oracle\11.2\Client_x86
(siehe unten)Ändern Sie die
PATH
Umgebungsvariable, ersetzen Sie alle Einträge wieC:\Oracle\11.2\Client_x86
undC:\Oracle\11.2\Client_x64
durchC:\Windows\System32\ora112
, Ihre jeweiligen\bin
Unterordner. Hinweis:C:\Windows\SysWOW64\ora112
darf nicht in die PATH-Umgebung.Wenn nötig, legen Sie Ihre
ORACLE_HOME
UmgebungsvariableC:\Windows\System32\ora112
Öffnen, Ihre Registry Editor. Set Registry-Wert
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
zuC:\Windows\System32\ora112
Set Registry-Wert
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
zuC:\Windows\System32\ora112
(nichtC:\Windows\SysWOW64\ora112
)Sind Sie fertig! Jetzt können Sie mit x86 und x64 Oracle client nahtlos zusammen, also eine x86-Anwendung geladen werden, die die x86-Bibliotheken, eine x64-Anwendung lädt die x64-Bibliotheken ohne weitere änderung auf Ihrem system.
Wahrscheinlich ist es eine kluge Wahl, um Ihre
TNS_ADMIN
environment-variable (resp.TNS_ADMIN
Einträge in der Registrierung) auf einem gemeinsamen Speicherort, zum BeispielTNS_ADMIN=C:\Oracle\Common\network
.Kommandos zum erzeugen der symbolischen 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
Hinweise:
Beide symbolischen links müssen den gleichen Namen haben, z.B.
ora112
.Trotz Ihrer Namen Ordner
C:\Windows\System32
enthält die x64-Bibliotheken, in der Erwägung, dassC:\Windows\SysWOW64
enthält die x86 (32-bit) Bibliotheken. Don ' T verwechselt werden.InformationsquelleAutor der Antwort Wernfried Domscheit
In meiner situation, die Oracle 11.2 32-bit-client war installiert auf meinem 64-bit-Windows - 2008 R2 OS.
Meine Lösung: In den Erweiterten Einstellungen für die Anwendungspool zugeordnet meiner ASP.NET Anwendung, ich Enable 32-Bit Applications zu Wahr.
Bitte siehe unten für die standalone -.ashx test-Skript, das ich verwendet, um zu testen die Fähigkeit, eine Verbindung zu Oracle. Bevor Sie den Anwendungspool ändern, seine Reaktion war:
...und nach der Anwendungspool ändern:
TestOracle.ashx – Skript zum Test einer Oracle-Verbindung über System.Daten.OracleClient:
Zu verwenden: Ändern Sie die Benutzer, Passwort und host-Variablen als angemessen.
Beachten Sie, dass dieses Skript kann verwendet werden, im standalone-Mode, ohne zu stören Ihre ASP.NET web-Anwendung-Projekt-Datei. Legen Sie es einfach in Ihrer Anwendung Ordner.
InformationsquelleAutor der Antwort DavidRR
Überarbeiten IIS
Kommentar:
Plattform: Windows Server 2008 R2 Enterprise - 64Bit - IIS 7.5
InformationsquelleAutor der Antwort javier maffla
Ich hatte das gleiche Problem auf einem Windows 10 PC. Kopiert habe ich das Projekt von meinem alten computer auf den neuen computer, beide 64 bit, und ich installierte Oracle Client 64 bit) auf die neue Maschine. Ich bekam die gleiche Fehlermeldung, aber nach dem Versuch viele Lösungen oder gar keine Wirkung, was wirklich für mich gearbeitet wurde:
In Ihrem Visual Studio (mir ist bis 2017) gehen Sie zu
Extras > Optionen > Projekte und Projektmappen > Web-Projekte
Auf dieser Seite, aktivieren Sie die option, die sagt:
Verwenden Sie die 64-bit-version von IIS Express für Websites und Projekte
InformationsquelleAutor der Antwort Amir Tofighi
Als es wurde darauf hingewiesen, in den Kommentaren, System.Daten.OracleClient ist veraltet. Es gibt wenig Grund zu beginnen, es so spät im Spiel.
Auch darauf hingewiesen, in den Kommentaren (habe ich markiert diese als " community-wiki in observence), gibt es jetzt einen managed provider als Teil der 12c und späteren Versionen von der odp.net Paket. Dieser Anbieter verlangt KEINE nicht verwalteten dlls, also das sollte kein Thema sein in diesem Fall.
Wenn Sie lieber die alte nicht verwaltete Oracle.DataAccess-Anbieter von oracle, die einfachste Lösung ist, um die ": DllPath" configuration variable:
Finden Sie unter "Suchreihenfolge für die nicht verwalteten DLLs" in http://docs.oracle.com/database/121/ODPNT/InstallODP.htm weitere Informationen
InformationsquelleAutor der Antwort
Ich hatte das gleiche problem in SSIS 2008. Ich habe versucht, eine Verbindung zu einer Oracle 11g mit ODAC 12c 32 bit. Versucht zu installieren ODAC 12c 64 bit. SSIS war tatsächlich in der Lage, um eine Vorschau der Tabelle, aber wenn Sie versuchen, führen Sie das Paket, es gab diese Fehlermeldung. Nichts half.
Geschaltet VS 2013, nun war es an der Ausführung im debug-Modus, aber habe den gleichen Fehler bei der Ausführung des Pakets unter Verwendung von dtexec /f filename.
Dann fand ich diese Seite:
http://sqlmag.com/comment/reply/17881.
Um es kurz zu machen, es sagt: (wenn die Seite noch da ist, gehen Sie einfach auf die Seite und Folgen Sie den instrucrtions...)
1) Downloaden und installieren Sie die neueste version odac 64 bit xcopy von der oracle-Website.
2) Laden und installieren Sie die neueste version odac 32 bit xcopy von der oracle-Website.
Wie? öffnen Sie eine cmd-shell ALS ADMINSTARTOR und ausführen:
c:\64bitODACLocation> installieren.bat oledb c:\odac\odac64.
der erste parameter ist die Komponente, die Sie installieren möchten. Der zweite Parameter ist, wo zu installieren.
installieren Sie die 32-version als auch, wie diese: c:\32bitODACLocation> installieren.bat oledb c:\odac\odac32.
3) Ändern Sie den Pfad des Systems zu gehören c:\odac\odac32; c:\odac\odac32\bin; c:\odac\odac64;c:\odac\odac64\bin IN DIESER REIHENFOLGE.
4) Starten Sie den Computer neu.
5) stellen Sie sicher, Sie haben die gleichen tnsnames.ora in beiden odac32\admin\Netzwerk-und odac64\admin\Netzwerk-Ordner (oder zumindest den selben Eintrag für die Verbindung).
6) öffnen Sie Nun bis SSIS in visual studio (ich habe die free 2013 version mit dem ssis-Paket) - OLEDB Verwenden, und wählen Sie dann die Oracle-Provider für OLE DB-provider als Verbindungsart. Legen Sie die name-der Eintrag in der tnsnames.ora als "server oder Datei-name". Benutzername ist Ihr name des Schemas (db-name) und Kennwort ist das Kennwort für das schema. Sie sind fertig!
Wieder, Sie finden können die sehr detaillierte Lösung und vieles mehr in der ursprünglichen Website.
Dies war die einzige Sache, die für mich gearbeitet und nicht mess up meine Umgebung.
Prost!
gcr
InformationsquelleAutor der Antwort gcr
Ich entwickelte desktop-Anwendung verwenden C#.net mit 2.0-framework zusammen mit system.Daten.oracleclient für die Anbindung von oracle-db-und ich Stand vor einer ähnlichen Fehlermeldung ,"Versuch zum laden von Oracle-client-Bibliotheken warf BadImageFormatException. Dieses problem wird auftreten, wenn die Ausführung im 64-bit Modus mit den 32-bit-Oracle-client-Komponenten installiert sind."
folgende Lösungen angewendet wurden
nun, es funktioniert, weil die Anwendung für 32-und oracle-32-bit-client installiert, über Win2012 R2 server, hoffentlich wird für Sie arbeiten.
InformationsquelleAutor der Antwort QSS
BadImageFormatException tritt auf, wenn eine 32-bit - (x86), dll-Aufrufe, die eine 64-bit-dll oder Umgekehrt. Wenn Sie mit AnyCPU für Ihre Eingabe ausführbaren dann, wenn die Ausführung auf einer 64-bit Maschine läuft als 64bit, aber wenn, dann ruft eine 32bit dll, die Sie erhalten die Ausnahme, das ist der Grund, warum AnyCPU ist nicht immer die Antwort.
Tendiere ich zu bauen alles als 32bit (x86), wie wir Sie noch haben, um eine Schnittstelle mit einigen alten Komponenten fertig in VB6 (32bit (x86)). Während die Leistung könnte besser sein für 64bit-Maschinen, wenn wir wo bauen in AnyCPU Zuverlässigkeit ist für uns mehr wichtig.
Ich würde vorschlagen, versuchen, bauen Sie alle Komponenten im 32-bit - (x86), es sei denn, Sie machen eine wirklich intensive Sachen, die ich bezweifle es wird viel Unterschied.
InformationsquelleAutor der Antwort apc
Apc erwähnt, der Fehler tritt auf, "wenn eine 32-bit-dll-Aufrufe, die eine 64-bit-dll oder Umgekehrt". Das problem ist, dass, wenn Sie bauen mit AnyCPU und laufen auf einer 64bit Umgebung wird die Anwendung laufen als 64bit.
Wenn eine Wiederherstellung, die explizit für 32-und 64-bit-ist keine option, dann könnten Sie ein microsoft-Dienstprogramm namens " corflags.exe die mit dem Windows SDK. Grundsätzlich können Sie ein flag in der exe-Datei des Programms, das Sie ausführen, um zu sagen, dass es zu laufen als 32 bit, auch wenn die Umgebung ist 64bit.
Sehen hier für Informationen über die Verwendung es
InformationsquelleAutor der Antwort Tomás
Möchte ich hinzufügen, eine Auflösung, die für mich gearbeitet.
Setup: Oracle 11g 64 bit läuft auf Windows 2008 R2 (64 bit OS)
Client ein .net framework 3.5-Anwendung (portiert von 2.0) kompiliert mit x86-Plattform einstellen.
Ich hatte das exakt gleiche Problem BadImageFormatException. Kompilieren auf 64 bit beseitigt die Ausnahme, aber es war keine option für mich, da meine app ist mit 32-bit-activex-Komponenten, die nicht in 64 bit.
Ich löste das Problem durch das herunterladen Oracle Instant Client 11 (dies ist nur ein Haufen von DLL werden können, als mit xcopied) von Oracle-website, und kopieren Sie die Dateien in meiner Anwendung Dateien-Verzeichnis. Siehe hier : http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf
Dieser hat das Problem gelöst, von ProcMon tool kann ich sehen, dass die lokal kopiert oci.dll geladen wird durch System.Daten.OracleClient-und alles ist in Ordnung.
Es konnte wahrscheinlich gemacht werden durch die sich verändernden Umwelt-Einstellungen wie oben vorgeschlagen, aber diese Methode hat den Vorteil, dass Sie nicht ändern alle Einstellungen auf der server-Konfiguration.
InformationsquelleAutor der Antwort Pascal
Ich habe dieses Problem für eine Konsole-Anwendung.
In meinem Fall habe ich nur geändert das Platform Target "auf" Any CPU", die Sie sehen können, wenn Sie mit der rechten klicken Sie auf Ihre Lösung und klicken Sie auf Eigenschaften , finden Sie eine Registerkarte "Erstellen" klicken Sie auf Sie, Sie werden sehen " - Plattform, target:" ändern Sie ihn auf "Any CPU", die lösen Ihre Problem
InformationsquelleAutor der Antwort user3559374
diese Lösung für mich arbeiten ,
Überarbeiten IIS
Kommentar:
Plattform: Windows Server 2012 Standard - 64-bit - IIS-8
InformationsquelleAutor der Antwort theozdemir
Mir ist die console-Anwendung (es sollte funktionieren, für die windows-Anwendung als gut) und ich hatte dasselbe problem.
Um es zu lösen ich verwendet PlatformTarget als x64, wie mein System.Data.OracleClient.dll (64-bit-Datei) an C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5. Dies wird explizit die Verwendung der 64-bit-version des Oracle-Clients.
Dies könnte Ihnen helfen, wenn Sie Ihre Lösung funktioniert nur auf 64bit und wenn Sie nicht mit der 32-bit-dlls wie dlls made in VB.
Ich hoffe es wird Euch helfen.
InformationsquelleAutor der Antwort Vikas
Bitte laden Sie die richtige version von Oracle Client Oracle Client 11.2 32-Bit; das ist das problem gelöst für mich.
InformationsquelleAutor der Antwort Raghu
Stellen Sie sicher, dass der registry HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\4.112.# DIIPath key auf 32 bit Oarcle-client-BIN-Verzeichnis.
Zum Beispiel, DIIPath Wert sein kann C:\app\User_name\11.2.0\client_32bit\bin
InformationsquelleAutor der Antwort vladimir
Einfach bauen Sie Ihren code in x86-Modus nicht in AnyCpu.
InformationsquelleAutor der Antwort Arno