.net - studio - oracle client 10g 64 bit download
BadImageFormatException. Esto ocurrirá cuando se ejecuta en modo de 64 bits con los componentes de cliente Oracle de 32 bits instalados (16)
Recibo este error mientras mi aplicación .Net
está intentando establecer una conexión con la base de datos Oracle.
El error dice que This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
. Pero me he asegurado muchas veces de que el cliente instaló en x64
bit, no en 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)
Asegúrese de que la clave HKEY_LOCAL_MACHINE / SOFTWARE / ORACLE / ODP.NET / 4.112. # DIIPath del registro apunte al directorio BIN del cliente Oarcle de 32 bits. Por ejemplo, el valor de DIIPath puede ser C: / app / User_name / 11.2.0 / client_32bit / bin
BadImageFormatException se activa cuando un dll de 32 bits (x86) llama a un dll de 64 bits o viceversa. Si usa AnyCPU para su entrada ejecutable, cuando se ejecute en una máquina de 64 bits se ejecutará como 64 bits, sin embargo, si eso llama a una dll de 32 bits, obtendrá la excepción, por lo que AnyCPU no siempre es la respuesta.
Tiendo a construir todo como 32 bits (x86) ya que aún tenemos que interactuar con algunos componentes antiguos hechos en VB6 (32 bits (x86)). Si bien el rendimiento podría ser mejor para las máquinas de 64 bits, si creamos la confiabilidad de AnyCPU es más importante para nosotros.
Sugeriría que intentes construir todos tus componentes en 32 bits (x86), a menos que estés haciendo cosas realmente intensivas. Dudo que haga mucha diferencia.
Como apc mencionó que el error ocurre "cuando un dll de 32 bits llama a un dll de 64 bits o viceversa". El problema es que si tiene compilación utilizando AnyCPU y se está ejecutando en un entorno de 64 bits, la aplicación se ejecutará como 64 bits. Si reconstruir explícitamente para 32 y 64 bits no es una opción, entonces podría usar una utilidad de Microsoft llamada corflags.exe que viene con el SDK de Windows. Básicamente, puede modificar un indicador en el exe del programa que está ejecutando para decirle que se ejecute como 32 bits, incluso si el entorno es de 64 bits.
Consulte here para obtener información sobre cómo usarlo
Como se señaló en los comentarios, System.Data.OracleClient está en desuso. Hay pocas razones para comenzar a usarlo tan tarde en el juego.
También como se señala en los comentarios (he marcado esto como wiki de la comunidad en la observación), ahora hay un proveedor administrado como parte de las 12c y versiones posteriores del paquete odp.net. Este proveedor NO requiere dlls no administrados, por lo que este no debería ser un problema en ese caso.
Si prefiere utilizar el antiguo proveedor Oracle.DataAccess no gestionado de Oracle, la solución más simple es establecer la variable de configuración "DllPath":
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="C:/oracle/bin"/>
</oracle.dataaccess.client>
</configuration>
Consulte "Buscar orden para archivos DLL no administrados" en http://docs.oracle.com/database/121/ODPNT/InstallODP.htm para obtener más información.
Desarrollé aplicaciones de escritorio usando C # .net con framework 2.0 junto con system.data.oracleclient para conectar Oracle DB y me encontré con un mensaje de error similar, "Intento de cargar las bibliotecas cliente de Oracle lanzó BadImageFormatException. Este problema ocurrirá cuando se ejecuta en modo de 64 bits con los componentes de cliente Oracle de 32 bits instalados ".
se aplicaron las siguientes soluciones
- Proyecto, propiedades, Build TAB, seleccione el objetivo de la plataforma: x86
- Proyecto, construcción limpia, solución ReBuild
- Instalar el cliente Oracle 11G * 32 bit
ahora, funciona porque la aplicación está configurada para el cliente 32bit y Oracle de 32 bits instalado en el servidor Win2012 R2, con suerte funcionará para usted.
Descargue la versión correcta de Oracle Client como Oracle Client 11.2 32-Bit; que resolvió el problema para mí.
En mi situación, el cliente Oracle 11.2 de 32 bits se instaló en mi sistema operativo Windows 2008 R2 de 64 bits .
Mi solución: en la Configuración avanzada para el grupo de aplicaciones asignado a mi aplicación ASP.NET , establezco Activar las aplicaciones de 32 bits en True .
Consulte a continuación el script de prueba autónomo .ashx que utilicé para probar la capacidad de conectarse a Oracle. Antes de cambiar el grupo de aplicaciones, su respuesta fue:
[Running as 64-bit] Connection failed.
... y después del cambio del grupo de aplicaciones:
[Running as 32-bit] Connection succeeded.
TestOracle.ashx - Script para probar una conexión de Oracle a través de System.Data.OracleClient:
Para usar: cambie las variables de usuario, contraseña y host según corresponda.
Tenga en cuenta que esta secuencia de comandos se puede utilizar de forma independiente sin alterar su archivo de proyecto de aplicación web ASP.NET. Simplemente colócalo en la carpeta de tu aplicación.
<%@ 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;
}
}
La mía es la aplicación de la consola (también debería funcionar para la aplicación de Windows) y tuve el mismo problema. Para resolverlo utilicé PlatformTarget como x64 ya que mi System.Data.OracleClient.dll (archivo de 64 bits) se encuentra en C: / Archivos de programa (x86) / Reference Assemblies / Microsoft / Framework.NETFramework / v4.5. Esto usará explícitamente la versión de 64 bit de Oracle Client. Esto podría ayudarlo si su solución solo funciona en 64 bits y si no está utilizando dlls de 32 bits como dlls fabricados en VB. Espero que te ayude.
Me gustaría agregar una resolución que funcionó para mí. Configuración: Oracle 11g 64 bits ejecutándose en Windows 2008 R2 (sistema operativo de 64 bits)
Client es una aplicación .NET Framework 3.5 (portada desde 2.0) compilada con la configuración de la plataforma x86.
Tuve exactamente el mismo problema de BadImageFormatException. La compilación de 64 bits elimina la excepción, pero no era una opción para mí, ya que mi aplicación usa componentes activos de 32 bits que no funcionan en 64 bits.
Resolví el problema descargando Oracle Instant Client 11 (esto es solo un montón de DLL que puede ser copiado) del sitio web de Oracle y copiando los archivos en el directorio de archivos de mi aplicación. Vea aquí: http://www.oracle.com/technetwork/database/features/oci/instant-client-wp-131479.pdf
Esto ha resuelto el problema, desde la herramienta ProcMon puedo ver que el oci.dll copiado localmente se carga por System.Data.OracleClient y todo está bien.
Probablemente podría hacerse cambiando la configuración del entorno como se propuso anteriormente, pero este método tiene la ventaja de no alterar ninguna configuración en la configuración del servidor.
Para revisar IIS
- Seleccione Grupos de aplicaciones.
- Clic en ASP .NET V4.0 Classic.
- Seleccione Configuraciones Avanzadas.
- En General, la opción Habilitar aplicaciones de 32 bits, el valor predeterminado es falso. Seleccione VERDADERO.
- Actualiza y revisa el sitio.
Comentario:
Plataforma: Windows Server 2008 R2 Enterprise - 64 bits - IIS 7.5
Simplemente crea tu código en modo x86 no en AnyCpu.
Tengo este problema para una aplicación de consola. En mi caso, acabo de cambiar el objetivo de la plataforma a "Cualquier CPU" que puedes ver cuando haces clic con el botón derecho en tu solución y haces clic en Propiedades, encontrarás una pestaña "Construir" y verás "Objetivo de la plataforma:" cámbialo a "Cualquier CPU", que resolverá su problema
Tuve el mismo problema en SSIS 2008. Intenté conectarme a un Oracle 11g usando ODAC 12c de 32 bits. Trató de instalar ODAC 12c de 64 bits también. SSIS realmente fue capaz de obtener una vista previa de la tabla, pero cuando intentaba ejecutar el paquete daba este mensaje de error. Nada ayudó. Cambiado a VS 2013, ahora se estaba ejecutando en modo de depuración pero obtuvo el mismo error cuando se ejecuta el paquete utilizando dtexec / f nombre de archivo. Luego encontré esta página: http://sqlmag.com/comment/reply/17881 .
Para abreviar, dice: (si la página aún está allí, solo ve a la página y sigue las instrucciones ...) 1) Descarga e instala la última versión de odac 64 bit xcopy del sitio de Oracle. 2) Descargue e instale la última versión de odac 32 bit xcopy desde el sitio de Oracle. ¿Cómo? abra un cmd shell AS AN ADMINSTARTOR y ejecute: c: / 64bitODACLocation> install.bat oledb c: / odac / odac64. el primer parámetro es el componente que desea instalar. El segundo parámetro es dónde instalarlo. instale también la versión 32 así: c: / 32bitODACLocation> install.bat oledb c: / odac / odac32. 3) Cambie la ruta del sistema para incluir c: / odac / odac32; c: / odac / odac32 / bin; c: / odac / odac64; c: / odac / odac64 / bin EN ESTE PEDIDO. 4) Reinicia la máquina. 5) asegúrese de tener el mismo tnsnames.ora en ambas carpetas odac32 / admin / network y odac64 / admin / network (o al menos la misma entrada para su conexión). 6) Ahora abra SSIS en Visual Studio (utilicé la versión gratuita 2013 con el paquete ssis) - Use OLEDB y luego seleccione Proveedor Oracle para el proveedor OLE DB como su tipo de conexión. Establezca el nombre de la entrada en su tnsnames.ora como "servidor o nombre de archivo". Nombre de usuario es su nombre de esquema (nombre db) y la contraseña es la contraseña para el esquema. ¡estás listo!
Nuevamente, puede encontrar la solución muy detallada y mucho más en el sitio original.
Esto fue lo único que funcionó para mí y no estropeó mi entorno.
¡Aclamaciones! gcr
Tuve el mismo problema en una PC con Windows 10. Copié el proyecto de mi computadora anterior a la nueva, ambas de 64 bits, e instalé el Oracle Client de 64 bits en la nueva máquina. Recibí el mismo mensaje de error, pero después de probar muchas soluciones sin ningún efecto, lo que realmente funcionó para mí fue este: en su Visual Studio (el mío es 2017) vaya a Herramientas> Opciones> Proyectos y soluciones> Proyectos web
En esa página, marque la opción que dice: Usar la versión de 64 bits de IIS Express para sitios web y proyectos
Una solución es instalar clientes Oracle x86 (32 bits) y x64 en su máquina, entonces no importa en qué arquitectura se ejecuta su aplicación.
Aquí una instrucción para instalar el cliente Oracle x86 y x64 en una máquina:
Suposiciones: Oracle Home se llama OraClient11g_home1
, la versión del cliente es 11gR2
Opcionalmente, elimine cualquier cliente de Oracle instalado (consulte Cómo desinstalar / eliminar completamente Oracle 11g (cliente) si tiene problemas)
Descargue e instale Oracle x86 Client, por ejemplo en
C:/Oracle/11.2/Client_x86
Descargue e instale Oracle x64 Client en una carpeta diferente , por ejemplo, en
C:/Oracle/11.2/Client_x64
Abra la herramienta de línea de comandos, vaya a la carpeta% WINDIR% / System32, normalmente
C:/Windows/System32
y cree un enlace simbólicoora112
a la carpetaC:/Oracle/11.2/Client_x64
(consulte la sección de comandos a continuación)Cambie a la carpeta% WINDIR% / SysWOW64, normalmente
C:/Windows/SysWOW64
y cree un enlace simbólicoora112
a la carpetaC:/Oracle/11.2/Client_x86
, (vea abajo)Modifique la
PATH
entornoPATH
, reemplace todas las entradas comoC:/Oracle/11.2/Client_x86
yC:/Oracle/11.2/Client_x64
porC:/Windows/System32/ora112
, respectivamente su subcarpeta/bin
. Nota:C:/Windows/SysWOW64/ora112
no debe estar en el entorno PATH.Si es necesario, establezca su variable de entorno
ORACLE_HOME
enC:/Windows/System32/ora112
Abra su Editor del Registro. Establezca el valor de registro
HKLM/Software/ORACLE/KEY_OraClient11g_home1/ORACLE_HOME
enC:/Windows/System32/ora112
Establezca el valor de Registro
HKLM/Software/Wow6432Node/ORACLE/KEY_OraClient11g_home1/ORACLE_HOME
enC:/Windows/System32/ora112
(no enC:/Windows/SysWOW64/ora112
)¡Estás listo! Ahora puede usar el cliente Oracle x86 y x64 sin problemas, es decir, una aplicación x86 cargará las bibliotecas x86, una aplicación x64 carga las bibliotecas x64 sin ninguna modificación adicional en su sistema.
Probablemente sea una sabia opción establecer su variable de entorno
TNS_ADMIN
(respectivamente las entradasTNS_ADMIN
en el Registro) en una ubicación común, por ejemploTNS_ADMIN=C:/Oracle/Common/network
.
Comandos para crear enlaces simbólicos:
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
Notas:
Ambos enlaces simbólicos deben tener el mismo nombre, por ejemplo, ora112
.
A pesar de su carpeta de nombres C:/Windows/System32
contiene las bibliotecas x64, mientras que C:/Windows/SysWOW64
contiene las bibliotecas x86 (32 bits). No te confundas
esta solución funciona para mí,
Para revisar 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.
Comentario:
Plataforma: Windows Server 2012 Standart- 64Bit - IIS 8