BadImageFormatException. Cela se produit lorsque vous exécutez en mode 64 bits avec la version 32 bits du client Oracle installé les composants
J'obtiens ce message d'erreur lors de mon .Net
application sont une tentative de connexion à la base de données oracle.
Le message d'erreur indique que This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
. Mais j'ai fait en sorte nombre de fois que le client a été installé dans x64
peu pas 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)
- Vous êtes à l'aide de
System.Data.OracleClient
. Cet espace de noms est obsolète et sera supprimée dans une future version de .NET. Peut-être que vous utilisez une version 32 bits de qui? Il ne fait pas partie de l'Oracle client, donc si vous utilisez une version 32 bits ou 64 bits du client Oracle n'est pas pertinent. Idéalement, vous devriez être en utilisantOracle.DataAccess
(ouOracle.ManagedDataAccess
) à la place. - Petite erreur:
System.Data.OracleClient
est juste le Fournisseur, il utilise également un Client Oracle qui doit correspondre à l'architecture. SeulementOracle.ManagedDataAccess
n'a pas besoin d'un surplus de client Oracle installé. Peut-être que le Client Oracle est de 64 bits, mais votre demande est en 32 bits, cela ne fonctionne pas non plus. Il est possible d'installer les deux versions 32 bits et 64 bits Oracle client sur la même machine
Vous devez vous connecter pour publier un commentaire.
Une solution consiste à installer les versions x86 (32 bits) et x64 Oracle Clients sur votre machine, alors il n'a pas d'importance sur l'architecture de votre application est en cours d'exécution.
Ici une instruction pour installer x86 et x64 client Oracle sur une machine:
Hypothèses: Oracle de la Maison, est appelé
OraClient11g_home1
, Client Version 11gR2Éventuellement supprimer toute installation du client Oracle (voir Comment désinstaller /supprimer complètement Oracle 11g (client)? si vous faites face à des problèmes)
Télécharger et installer Oracle x86 Client, par exemple en
C:\Oracle\11.2\Client_x86
Télécharger et installer Oracle x64 Client dans différents dossier, par exemple à
C:\Oracle\11.2\Client_x64
Ouvrir l'outil de ligne de commande, accédez au dossier %WINDIR%\System32, généralement
C:\Windows\System32
et de créer un lien symboliqueora112
de dossierC:\Oracle\11.2\Client_x64
(voir la section commandes ci-dessous)Changement dans le dossier %WINDIR%\SysWOW64, généralement
C:\Windows\SysWOW64
et de créer un lien symboliqueora112
de dossierC:\Oracle\11.2\Client_x86
, (voir ci-dessous)Modifier le
PATH
variable d'environnement, remplacer toutes les entrées comme lesC:\Oracle\11.2\Client_x86
etC:\Oracle\11.2\Client_x64
parC:\Windows\System32\ora112
, en leur\bin
sous-dossier. Remarque:C:\Windows\SysWOW64\ora112
ne doit pas être dans le CHEMIN d'accès de l'environnement.Si nécessaire, réglez votre
ORACLE_HOME
variable d'environnement pourC:\Windows\System32\ora112
Ouvrez votre Éditeur de Registre. Définissez la valeur de Registre
HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
àC:\Windows\System32\ora112
Définir la valeur de Registre
HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME
àC:\Windows\System32\ora112
(pasC:\Windows\SysWOW64\ora112
)Vous êtes fait! Maintenant, vous pouvez utiliser x86 et x64 Oracle client sans couture ensemble, c'est à dire un x86 application va charger le x86 bibliothèques, une application x64 charge le x64 bibliothèques sans aucune autre modification sur votre système.
C'est probablement une option sage pour définir votre
TNS_ADMIN
variable d'environnement (resp.TNS_ADMIN
les entrées dans le Registre), à un emplacement commun, par exempleTNS_ADMIN=C:\Oracle\Common\network
.Commandes pour créer des liens symboliques:
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
Notes:
Les deux liens symboliques doivent avoir le même nom, par exemple
ora112
.En dépit de leurs noms de dossier
C:\Windows\System32
contient le x64 bibliothèques, alors queC:\Windows\SysWOW64
contient le x86 (32 bits) des bibliothèques. Ne pas confondre.OraClient11g_home1
est "l'Oracle de la Maison Nom", qui est utilisé pour identifier la bonne clé dans votre base de registre, voir Comment la Maison Sélecteur de Travaux. Dans les précédentes versions d'Oracle vous aviez un "Oracle de la Maison Sélecteur" application où vous pouvez basculer entre les différentes Oracle Clients installés sur une machine. Il n'est pas obligatoire d'avoir de l'Oracle de la Maison Nom de l'égalité pour le nom de votre dossier où Oracle est installé. Oracle de Base "C:\Oracle\11.2\Client_x86" et l'Emplacement du Logiciel "C:\Oracle\11.2\Client_x86\OraClient11g_home1" fonctionne très bien.%WINDIR%\System32\ora112\bin
qui points àC:\Oracle\11.2\Client_x64\bin
alors qu'un 32 bits fournisseur de recherches en%WINDIR%\SysWOW64\ora112\bin
qui points àC:\Oracle\11.2\Client_x86\bin
. Vous ne pouvez pas placer des dossiers directement àPATH
, parce que (selon commande), un fournisseur 64 bits pouvez rechercher d'abordC:\Oracle\11.2\Client_x86\bin
et serait un échec.Oracle.DataAccess.dll
lui-même les charges supplémentaires Oracle dll (par exempleoci.dll
ouoranls11.dll
, etc) et ceux de dll sont recherchés dans les dossiers répertoriés dansPATH
de l'Environnement (plus le répertoire courant). Ainsi, selon que vous exécutez 64 ou 32 bits,Oracle.DataAccess.dll
a de la recherche dans les différents dossiers. Ceci est réalisé par les liens symboliques.c:\oracle\product\11.2\Client_x64;c:\oracle\product\11.2\Client_x64\bin
directement dansPATH
travaillé pour ODP.NET(x86), mais certains OLEBD(x86) et ODBC(x86) pilotes a échoué. Sans les liens symboliques ont tous échoué si l'architecture ne correspond pas, c'est à dire ODP.NET, OLEDB et ODBC - peu importe que j'utilise les pilotes Microsoft (qui sont obsolètes en dehors de ODBC) ou les pilotes Oracle.Dans ma situation, l'Oracle 11.2 client 32 bits était installé sur mon 64 bits de Windows 2008 R2 OS.
Ma solution: Dans les Paramètres Avancés pour les Application de la Piscine affecté à mon ASP.NET application, j'ai mis Activer les Applications 32 Bits à Vrai.
Veuillez voir ci-dessous pour la version autonome de .ashx script de test que j'ai utilisé pour tester la capacité de se connecter à Oracle. Avant de faire le Pool d'Applications de changement, sa réponse a été:
...et après l'Application de la Piscine modification:
TestOracle.ashx – Script pour Tester une Connexion Oracle via le Système.Les données.OracleClient:
À utiliser: Changer l'utilisateur, le mot de passe de l'hôte et les variables.
Noter que ce script peut être utilisé en mode autonome, sans déranger vos ASP.NET projet d'application web fichier. Il suffit de le déposer dans votre dossier d'application.
J'ai eu le même problème sur un de Windows 10 sur PC. J'ai copié le projet de mon ancien ordinateur vers le nouveau, à la fois 64 bits, et j'ai installé le Client Oracle 64 bits sur la nouvelle machine. J'ai eu le même message d'erreur, mais après avoir essayé de nombreuses solutions à aucun effet, ce qui a effectivement travaillé pour moi c'était ça:
Dans votre Visual Studio (le mien est 2017) aller à
Outils > Options > les Projets et les Solutions > Projets Web
Sur cette page, cochez l'option qui dit:
Utiliser la version 64 bits de IIS Express pour les Sites web et les Projets
Comme il a été souligné dans les commentaires, Système.Les données.OracleClient est obsolète. Il y a peu de raison de commencer à l'utiliser si tard dans le jeu.
Aussi comme l'a souligné dans les commentaires (j'ai marqué ce que wiki de la communauté dans observence), il est maintenant un fournisseur géré dans le cadre de la 12c et les versions ultérieures de la odp.net package. Ce fournisseur ne nécessite PAS de dll non managées ce qui devrait être un non-problème dans ce cas.
Si vous préférez utiliser le vieux non géré Oracle.DataAccess fournisseur à partir d'oracle, la solution la plus simple consiste à définir la "DllPath" variable de configuration:
Voir "Ordre de Recherche des Dll non gérées" dans http://docs.oracle.com/database/121/ODPNT/InstallODP.htm pour plus d'informations
De réviser IIS
Commentaire:
Plate-forme: Windows Server 2008 R2 Enterprise - 64Bit - IIS 7.5
J'ai eu le même problème dans SSIS 2008. J'ai essayé de vous connecter à une base de données Oracle 11g utilisation des ODAC 12c 32 bits. Essayé d'installer ODAC 12c 64 bits. SSIS été réellement en mesure de prévisualiser la table, mais lorsque vous essayez d'exécuter le package qu'il était en train de donner ce message d'erreur. Rien n'a aidé.
Passé à VS 2013, maintenant, il était en cours d'exécution en mode debug, mais j'ai reçu le même message d'erreur lors de l'exécution du package à l'aide de dtexec /f nom de fichier.
Ensuite, j'ai trouvé cette page:
http://sqlmag.com/comment/reply/17881.
Pour faire court, il est dit: (si la page est toujours là, juste aller à la page et de suivre les instrucrtions...)
1) Télécharger et installer la dernière version de l'odac 64 bits xcopy à partir de oracle site.
2) Télécharger et installer la dernière version de l'odac 32 bits xcopy à partir de oracle site.
Comment? ouvrir un cmd shell COMME UN ADMINSTARTOR et de l'exécution:
c:\64bitODACLocation> installer.chauve-souris oledb c:\odac\odac64.
le premier paramètre est le composant que vous souhaitez installer. Le deuxième paramètre est l'endroit où l'installer.
installer la version 32 ainsi comme ceci: c:\32bitODACLocation> installer.chauve-souris oledb c:\odac\odac32.
3) Modifier le chemin d'accès du système d'inclure c:\odac\odac32; c:\odac\odac32\bin; c:\odac\odac64;c:\odac\odac64\bin DANS CET ORDRE.
4) Redémarrer la machine.
5) assurez-vous que vous avez les mêmes tnsnames.ora dans les deux odac32\admin\réseau et odac64\admin\dossiers réseau (ou au moins la même entrée pour votre connexion).
6) ouvrez Maintenant SSIS dans visual studio (j'ai utilisé le logiciel gratuit version 2013 avec le package ssis) - Utilisation OLEDB, puis sélectionnez le Fournisseur Oracle pour le fournisseur OLE DB comme type de connexion. Définir le nom de l'entrée dans votre tnsnames.ora comme le "serveur ou le nom de fichier". Le nom d'utilisateur est votre nom de schéma (db name) et le mot de passe est le mot de passe pour le schéma. vous avez terminé!
Encore une fois, vous pouvez trouver le très une solution détaillée et beaucoup plus dans le site d'origine.
C'était la seule chose qui a fonctionné pour moi et n'avez pas gâcher mon environnement.
Cheers!
rme
J'ai développé une application de bureau à l'aide de C#.net avec le framework 2.0 avec système.les données.oracleclient pour la connexion oracle db et j'ai été confronté message d'erreur similaire ,"l'attentat à la charge du client Oracle bibliothèques jeté BadImageFormatException. Ce problème se produit lorsque vous exécutez en mode 64 bits avec la version 32 bits du client Oracle installé les composants."
solutions suivantes ont été appliquées
maintenant, il travail en raison de l'application est définie pour les 32 bits et oracle 32 bits installé le client sur Win2012 R2 serveur, j'espère qu'il va travailler pour vous.
BadImageFormatException se passe quand un 32 bits (x86) dll appelle une dll 64 bits ou vice versa. Si vous utilisez AnyCPU pour votre entrée exécutable puis, lorsqu'il est exécuté sur une machine 64 bits, il va fonctionner que 64 bits, par contre si puis appelle une dll 32 bits, vous obtenez l'exception qui est pourquoi AnyCPU n'est pas toujours la réponse.
J'ai tendance à construire tout comme 32 bits (x86) que nous avons encore à l'interface avec certains anciens composants fait en VB6 (32 bits (x86)). Alors que les performances pourraient être mieux pour les machines 64 bits si nous construire dans AnyCPU la fiabilité est plus important pour nous.
Je suggère d'essayer de construire toutes les composantes de 32 bits (x86), sauf si vous faites vraiment intensive des choses que je doute qu'il va faire beaucoup de différence.
Comme apc mentionné que l'erreur se produit "lorsqu'un 32 bits dll appelle une dll 64 bits ou vice-versa". Le problème est que si vous avez à construire à l'aide de AnyCPU et sont en cours d'exécution sur un environnement 64 bits alors que l'application s'exécute en tant que 64 bits.
Si la reconstruction explicitement pour 32 et 64 bits n'est pas une option, alors vous pouvez utiliser un utilitaire microsoft appelé corflags.exe qui vient avec le kit de développement logiciel Windows. Fondamentalement, vous pouvez modifier un drapeau dans le fichier exe du programme en cours d'exécution à dire qu'il fonctionne comme 32 bits, même si l'environnement est 64 bits.
Voir ici pour plus d'informations sur l'utilisation de ce
Je voudrais ajouter une résolution qui a fonctionné pour moi.
Programme d'installation: Oracle 11g 64 bits s'exécutant sur Windows 2008 R2 (64 bits OS)
Client est un .net framework 3.5 application (porté à partir de 2.0) compilé avec plate-forme x86 réglage.
J'ai eu exactement le même problème de BadImageFormatException. La compilation 64 bits élimine l'exception, mais ce n'était pas une option pour moi que mon application est en utilisant 32 bits composants activex qui ne fonctionne pas en 64 bits.
J'ai résolu le problème en téléchargeant le Client Oracle Instant 11 (c'est juste un tas de DLL que peut être xcopied) à partir d'Oracle site web, et de copier les fichiers dans mon dossier de candidature répertoire des fichiers. Voir ici : http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf
Ce qui a résolu le problème, de ProcMon outil que je peux voir que le copié localement oci.dll est chargé par le Système.Les données.OracleClient et tout va bien.
Il pourrait probablement être fait en changeant les paramètres de l'environnement comme proposé ci-dessus, mais cette méthode a l'avantage de ne pas modifier les paramètres de la configuration du serveur.
cette solution de travail pour moi ,
De réviser IIS
Commentaire:
Plate-forme: Windows Server 2012 Standard - 64Bit - IIS 8
De la Mine est l'application de console (il doit travailler pour l'application windows) et j'ai eu le même problème.
Pour le résoudre j'ai utilisé PlatformTarget comme x64 comme mon System.Data.OracleClient.dll (64 bits fichier) est à C:\Program Files (x86)\de Référence Assemblées\Microsoft\Framework.NETFramework\v4.5. Cela permettra d'utiliser de manière explicite 64 bits version du Client Oracle.
Ceci peut vous aider si votre solution ne fonctionne que sur 64 bits et si vous n'êtes pas en utilisant 32 bits dll comme dll fait en VB.
J'espère que ça va vous aider.
S'il vous plaît télécharger la bonne version de Oracle Client comme Client Oracle 11.2 32-Bit; ce qui a résolu le problème pour moi.
J'avais aussi le même message d'erreur je l'ai vérifié mon système est en 64 bits et j'ai été en utilisant oracle.DataAccess de la version 32 bits, j'ai ajouté corriger 64 version maintenant, il a obtenu résolu
ci-dessous le chemin pour la ref de Oracle.DataAccess.dll
Chemin d'accès Correct pour la version 64 bits de l'OS
C:\Oracle\11g_64\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll
Chemin d'accès Correct pour les OS 32 bits-
C:\Oracle\11g_32\product\11.2.0\client_64\odp.net\bin\4\Oracle.DataAccess.dll
J'ai eu cette erreur dans mon DNN application installée sur Windows 2012 R2. C'est à l'aide de quelques 32 bits dll et seulement Oracle.DataAccess.dll x32 était le travail. Ma solution est:
J'ai eu ce problème pour une Application console.
Dans mon cas, j'ai juste changé le Plate-forme Cible à "CPU" que vous pouvez voir lorsque vous cliquez droit sur votre solution et cliquez sur "propriétés", vous trouverez un Onglet "Build" cliquez dessus, vous allez voir "la Plate-forme cible:" changer pour "any CPU", qui permettra de résoudre votre problème
Assurez-vous que le registre HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\4.112.# DIIPath clé pointe vers 32 bits Oarcle client répertoire BIN.
Par exemple, DIIPath valeur peut être C:\app\User_name\11.2.0\client_32bit\bin
Tout simplement construire votre code x86 en mode pas à AnyCpu.