c# - example - Problema de IBM DB2-System.BadImageFormatException: no se pudo cargar el archivo o ensamblar IBM.DB2.DLL o una de sus dependencias
download db2 client 11 (5)
Recibo el mensaje de error mencionado anteriormente. Hice suficientes investigaciones y probé varias opciones pero todavía no tuve suerte.
Aquí están los detalles a continuación:
OS: Windows 7 64 bit version
Visual studio version: 2013 Premium
.NET framework version is : 4.0.30319
ASP.NET version: 4.0.30319.34249
IIS version: 7.0
DB2 installed path: C:/Program Files (x86)/IBM
DLL path: C:/Program Files (x86)/IBM/SQLLIB/BIN/netf40/IBM.DB2.dll
DLL Version: 9.7.4.4
También cambié la plataforma del administrador de configuración de la solución a Cualquier CPU y también modifiqué la configuración en el grupo de aplicaciones estableciendo la propiedad habilitar la aplicación de 32 bits en Verdadero .
Pero aún recibo el mismo error. ¿Hay alguna otra solución?
Por favor ayúdenme con sus sugerencias.
Parece que está intentando cargar un controlador IBM DB2 compilado de 32 bits desde una aplicación .NET que se ejecuta en modo de 64 bits. Intenta cambiar el administrador de configuración para que se ejecute en modo x86.
En mi caso, esto estaba sucediendo con Windows Server 2012 R2 Standard. Este es un error causado por el paquete que no se instala en Global Cache Assembly. Asegúrese de marcar C: / Windows / Assembly para asegurarse de que su programa esté instalado correctamente en GAC_32, GAC_64 , debería ver
Si no, esto es lo que tenía que hacer para resolverlo.
1) Tuve que verificar la versión que había instalado para asegurar la compatibilidad.
2) El "CLIENTE IBM DATA SERVER" no se instaló correctamente, utilizando la GUI debido a un error, por lo que tuvo que ejecutarse en silencio usando esto como administrador
3) Debido a la naturaleza del servidor, tuve que instalar .Net 3.5 usando IBM-Steps <- Link. Eso no funcionó para mí, así que tuve que usar MS-Steps <- Link con estas líneas
DISM /Image:C:/test/offline /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:D:/sources/sxs
4) Descubrió que uno de los problemas es que el "CLIENTE DEL SERVIDOR DE DATOS DE IBM" todavía no se instaló correctamente al verificar la carpeta DB2LOG que se encuentra en su C: / User_Dir / Document / DB2LOG
5) Tuve que instalar el último arreglo "IBM DATA RUN TIME CLIENT" en mi caso para 9.7 es el arreglo 10, se puede acceder gratis en la página de descarga de IBM, solo tiene que registrarse, demora 1 minuto y se obtiene una respuesta lo antes posible, asegúrese sigues, espera hasta que comience tu factor de estupidez ... yo ...
6) Luego pude instalar "IBM DATA SERVER CLIENTE"
7) Verifique dos veces para asegurarse de que pueda ver "DB2COPY1" o lo que sea que elija para llamar a su copia de instalación.
Estoy seguro de que no necesita los dos, sin embargo, no voy a meterse con esto.
Recientemente tuve este problema. Descubrí que el proceso de publicación en Visual Studio ponía una copia de IBM.Data.DB2.dll en el directorio BIN de la aplicación web. Cuando se elimina manualmente, la aplicación web comienza a funcionar correctamente. No sé por qué se publica, ya que no se referencia directamente.
La forma más fácil que he encontrado para resolver esto, es usar un evento Post-build.
Propiedades del proyecto -> Eventos de compilación -> Línea de comando de evento posterior a la compilación
Aquí está la línea de comando que estoy usando:
del $(TargetDir)/IBM.Data.DB2.dll
Este problema me sucedió estos días y se resolvió siguiendo lo que dice este documento de IBM , es decir , ir a la referencia en el proyecto y establecer "Copiar local" en falso para dlls de DB2, haciendo referencia directamente a los de la configuración del cliente de DB2
Voy a saltar aquí y poner en práctica mis pasos para automatizar por completo el despliegue de .Net Data Providers de IBM ya que este es el primero de MUCHOS errores con los que me encontré tratando de hacer que esto funcione. Espero que alguien evite ponerse en la rueda del dolor leyendo estos pasos.
- Agregue la referencia a los proveedores de datos DB2 .Net usando nuget: https://www.nuget.org/packages/IBM.Data.DB2/ Notará que le da una pista del dolor que está por sufrir: AVISO - Este packakge requiere que el software de cliente IBM DB2 se instale localmente y esté disponible en su variable de entorno% PATH%.
A continuación, deberá configurar los archivos DLL a los que acaba de hacer referencia para que no se incluyan en la carpeta BIN configurando los archivos DLL para copiar Local FALSE haciendo clic con el botón derecho en las referencias y yendo a las propiedades.
Si estos se ponen en el BIN obtendrás el mensaje de error:
[BadImageFormatException: no se pudo cargar el archivo o ensamblado ''IBM.Data.DB2'' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.]
Referencia de IBM al problema: http://www-01.ibm.com/support/docview.wss?uid=swg21902663
- Ahora, para comenzar a desarrollar, necesitará instalar los paquetes de controladores o el cliente de tiempo de ejecución desde aquí https://www-945.ibm.com/support/fixcentral/ (buena suerte) o recibirá los siguientes errores:
Mensaje de excepción: no se pudo cargar el archivo o ensamblado ''IBM.Data.DB2, Versión = 9.7.4.4, Cultura = neutral, PublicKeyToken = 7c307b91aa13d208'' o una de sus dependencias. El sistema no puede encontrar el archivo especificado.
- ¡Desarrollando tiempo! ¡Que te diviertas!
Ahora necesita implementar y se da cuenta de que tiene un problema con la automatización de la instalación de un controlador de DB2 y comienza a buscar soluciones:
Cómo implementar correctamente el proveedor de datos IBM DB2
No queriendo instalar manualmente en DEV / QA / STG / PROD, encontré que puede instalar IBM Data Server Client Package silenciosamente a través de la línea de comandos usando un archivo de respuesta. Aproximadamente a la mitad de esta página: https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.swg.im.dbclient.install.doc/doc/t0007315.html encontrará la información relevante después de esta línea:
Para instalar el software IBM Data Server Driver Package, ejecute el comando v10.5fpX_ntxYY_dsdriver_EN. La X representa el valor del número de paquete de arreglos y el YY representa una versión de 32 bits o de 64 bits.
Un enlace a un archivo de muestra de respuesta para copiar y cambiar con su información está aquí: https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.apdv.sample.doc/doc /dsdriver/s-dsdriver-rsp.html
Ahora estás todo bien ¿verdad? INCORRECTO. Aparentemente, una "instalación exitosa" no incluye mover las DLL apropiadas al GAC y registrarlas en el Registro. Gracias IBM: https://www-01.ibm.com/support/docview.wss?uid=swg21618434
No queriendo renunciar a mis sueños de implementación automatizada, puse todo el conocimiento anterior en una secuencia de comandos de Powershell:
param([string]$driverPath,[string]$installPath) [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") $publish = New-Object System.EnterpriseServices.Internal.Publish Write-output "Installing v11.1.2fp2a_ntx64_dsdriver_EN.exe" & "$driverPath/v11.1.2fp2a_ntx64_dsdriver_EN.exe" /u "$driverPath/DB2.cfg" /l "$driverPath/log.txt" | Out-null $publish.GacInstall("$installPath/bin/netf20/IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath/bin/netf20_32/IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath/bin/netf40/IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath/bin/netf40_32/IBM.Data.DB2.dll") | Out-null $publish.GacInstall("$installPath/bin/netf20/IBM.Data.DB2.Entity.dll") | Out-null $publish.GacInstall("$installPath/bin/netf20_32/IBM.Data.DB2.Entity.dll") | Out-null $publish.GacInstall("$installPath/bin/netf40/IBM.Data.DB2.Entity.dll") | Out-null $publish.GacInstall("$installPath/bin/netf40_32/IBM.Data.DB2.Entity.dll") | Out-null
Ahora verá que está recibiendo otro error. Hasta ahora solo estabas peleando con los problemas de IBM.Data.DB2. * .dll. El siguiente error ahora está presente:
Mensaje de excepción: no se puede cargar la DLL ''db2app64.dll'': no se pudo encontrar el módulo especificado. (Excepción de HRESULT: 0x8007007E)
¡Vamos IBM! Una búsqueda rápida en Google encuentra los mismos resultados que obtuvimos con el # 1. "Cambie su aplicación a 32 bits" Esto está mal, por supuesto, ¡ahora lo sabemos mejor!
¡Te ayudaré y te dejaré saber que esta DLL se instaló junto con las OTRAS DLL, solo en una ruta diferente!
Solo agrégalos a la parte inferior de la secuencia de comandos de Powershell:
$publish.GacInstall("$installPath/bin/db2app.dll") | Out-null $publish.GacInstall("$installPath/bin/db2app64.dll") | Out-null
Ahora tiene un proveedor de DB2 .Net totalmente automatizado para conectarse a un servidor de DB2.
Espero que esto ayude.
EDITAR: puede aislar alternativamente los archivos DLL necesarios y solo incluirlos en una carpeta (como / lib /) e implementarlos en lugar de instalarlos con un archivo ejecutable. Haga referencia a la ubicación / lib / en lugar de la ubicación de instalación del controlador para pasar al GAC.