No se pudo cargar el archivo o ensamblado 'System.Data.SQLite'

126

He instalado ELMAH 1.1 .Net 3.5 x64 en mi proyecto ASP.NET y ahora recibo este error (cada vez que intento ver alguna página):

No se pudo cargar el archivo o ensamblado 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.

Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.BadImageFormatException: No se pudo cargar el archivo o ensamblado 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.

Más detalles de error en la parte inferior.

Mi plataforma de solución activa es "Cualquier CPU" y estoy ejecutando en un Windows 7 x64 en un procesador x64, por supuesto. La razón por la que estamos usando esta versión de ELMAH es porque 1.0 .Net 3.5 (x86, que es la única plataforma para la que está compilada) nos dio el mismo error en nuestro servidor x64 de Windows.

He intentado compilar para x86 y x64 y obtengo el mismo error. Intenté eliminar todo el compilador de salida (bin y obj). Finalmente, hice una referencia al SQLite dll directamente, algo que no era necesario para que el proyecto funcionara en el servidor y obtuve este error de compilación:

Error 1 Advertencia como error: generación de ensamblado: el ensamblado al que se hace referencia 'System.Data.SQLite.dll' se dirige a un procesador diferente MyProject

¿Alguna idea de por qué podría ser el problema?

Más detalles del error:

Error de fuente:

Se generó una excepción no controlada durante la ejecución de la solicitud web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de la pila de excepciones a continuación.

Seguimiento de pila:

[BadImageFormatException: no se pudo cargar el archivo o ensamblado 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una de sus dependencias. Se ha intentado cargar un programa con un formato incorrecto.]
System.Reflection.Assembly._nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.Asse .nLoad (AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark & ​​stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43
System.Reflection.Assembly.InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boolean forIntrospection) +127 System.Reflection.Assembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & ​​stackMark, Boole. Load (String assemblyString) +28
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +46

[ConfigurationErrorsException: no se pudo cargar el archivo o ensamblado 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String assemblyName, Boolean starDirective) +613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory () +203 System.b3Configuration. .CompilationSection.LoadAssembly (AssemblyInfo ai) +105
System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection compConfig) +178
System.Web.Compilation.BuildProvidersCompiler..ctor (VirtualPath configPath, Boolean supportLocalization, String output5454)
System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (Boolean isPrecompiledApp) +232
System.Web.Compilation.BuildManager.CompileGlobalAsax () +52 System.Web.Compilation.BuildManager.EnsilesTopLevel ()

[HttpException (0x80004005): No se pudo cargar el archivo o ensamblado 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException () +58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled () +512 System.Web.Hosting.HostingEnvironment.Initialize.Initialize.Initialize.Initialize.Initialize.Initialize.Initialize. ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729

[HttpException (0x80004005): No se pudo cargar el archivo o ensamblado 'System.Data.SQLite, Version = 1.0.61.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.]
System.Web.HttpRuntime.FirstRequestInit (contexto HttpContext) +8896783
System.Web.HttpRuntime.EnsureFirstRequestInit (contexto HttpContext) +85
System.Web.HttpRuntime.ProcessRequestWntererHerverRequestInter ) +259

pupeno
fuente
Un registro de Fusion (enlace de ensamblaje) es mucho más útil en estos casos que esta hoja de seguimiento de pila.
Anton Tykhyy el
1
Parece que el problema era que Cassini es x86.
pupeno
Tuve el mismo problema y tuve que abandonar ELMAH debido al entorno mixto de producción / desarrollo que tenemos. Dado que el uso de SQLite en un servidor web de producción de alto tráfico no suena muy bien y el hecho de que SQLite dll es el único ensamblado en ELMAH que lo obliga a tener dos versiones diferentes para x86 y 64x bits, me pregunto por qué los chicos de ELMAH tiran y hacerlo opcional en lugar de lo que es ahora.
Khash

Respuestas:

122

System.Data.SQLite.dlles un ensamblado mixto, es decir, contiene código administrado y código nativo. Por lo tanto, un particular System.Data.SQLite.dlles x86 o x64, pero nunca ambos.

Actualización ( cortesía de J. Pablo Fernández ): Cassini, el servidor web de desarrollo utilizado por Visual Studio cuando presiona F5 o hace clic en el botón verde "reproducir", es solo x86, lo que significa que incluso si su estación de trabajo es x64, solo será capaz de usar la versión x86 de System.Data.SQLite.dll.

Una alternativa es no usar Cassini sino IIS7, que es correctamente x64.

Anton Tykhyy
fuente
3
Estoy usando la versión x64 en una computadora x64.
pupeno
¿Intentaste usar la versión x86?
Anton Tykhyy
2
Una nueva alternativa que estuvo disponible hace poco es usar IIS Express que le permite establecer el tipo de grupo de aplicaciones que desea usar
Raul Vejar,
@Raul Vejar: explique cómo la función de selección del grupo de aplicaciones de IIS Express resuelve el problema del ensamblaje de 32 bits / 64 bits. Gracias
Tim
@Tim, esa característica le permite seleccionar el tipo de grupo de aplicaciones que desea usar, ya sea de 32 o 64 bits, de esa manera puede controlar ese aspecto que se arregló en Cassini y trabajar con la misma biblioteca de bits que tiene. En otras palabras, si está utilizando la versión de 32 bits de SQLite dll, debe seleccionar el grupo de aplicaciones de 32 bits en IIS Express. Para la versión de 64 bits de la biblioteca, debe seleccionar el grupo de aplicaciones de 64 bits.
Raúl Vejar el
77

Asegúrese de que "Habilitar aplicaciones de 32 bits" esté establecido en falso para el grupo de aplicaciones.

Beckelmw
fuente
2
Esto funciona si desea utilizar el x86 dll en la máquina de 64 bits. En nuestro caso, nuestros entornos de desarrollo y producción no coinciden, así que esto fue lo que funcionó mejor.
Rob
17
Establecerlo en verdadero para mí en realidad resolvió el problema. Supongo que Elmah se envía con el ensamblaje sql lite de 32 bits por defecto.
1
+1 tanto para @Jirapong como para Sergey porque fue esta configuración la que tuve que manipular para que las cosas funcionaran. En mi caso, creo que tenía la versión x86 de la DLL SqlLite y necesitaba Activar aplicaciones de 32 bits para que se configurara como "verdadero".
t3rse
43

Ve al IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

Umar
fuente
Estoy ejecutando Windows 7, y llegué a este problema; activar 32 bits me lo arregló, presumiblemente porque mi copia de la DLL era de 32 bits.
Doug
1
FYI: fue necesario establecer la identidad del grupo de aplicaciones en LocalSystem para que esto funcione: ^
Illuminati
Y asegúrese de tener una versión Win32 del SQLite.Interop.dll stackoverflow.com/questions/4816529/…
Morten Holmgaard
14

Esto es muy simple si no está utilizando SQLite:

Puede eliminar las DLL de SQLite de las carpetas bin de su solución, luego de la carpeta donde hace referencia a ELMAH. Reconstruya, y su aplicación no intentará cargar esta DLL que no está utilizando.

Chris
fuente
55
+1 Si no está utilizando SQLite, ¿por qué molestarse en arreglar la DLL referenciada? Agradable, elegante y justo lo que necesitaba.
bhavinb
Esto funcionó localmente, pero luego recibí el error después de implementar en Azure.
stuartdotnet
8

Tengo una máquina de desarrollo de 64 bits y un servidor de compilación de 32 bits. Utilicé este código antes de la inicialización de NHibernate. Funciona a la perfección en cualquier arquitectura (bueno, las 2 que he probado)

Espero que esto ayude a alguien.

Guido

        private static void LoadSQLLiteAssembly()
        {
            Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
            FileInfo fi = new FileInfo(dir.AbsolutePath);           
            string binFile = fi.Directory.FullName + "\\System.Data.SQLite.DLL";
            if (!File.Exists(binFile)) File.Copy(GetAppropriateSQLLiteAssembly(), binFile, false);
        }

        private static string GetAppropriateSQLLiteAssembly()
        {
            string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
            string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
            return GetLibsDir() + "\\NUnit\\System.Data.SQLite.x" + arch + ".DLL";
        }
gatapia
fuente
¿Alguien ha utilizado con éxito esta técnica? Lo probé en una solución de aplicación asp.net mvc de prueba y no funcionó para mí.
Glenn
1
En lugar de ir a la variable de entorno, puede usar CLR directamente: string arch = IntPtr.Size == 8? "x64": "x86";
Jason Morse
2
O la propiedad Environment.Is64BitProcess (desde .NET4).
riezebosch
5

En nuestro caso no funcionó porque falta nuestro servidor de producción

Paquete redistribuible de Microsoft Visual C ++ 2010 SP1 (x86)

Lo instalamos y todo funciona bien. El grupo de aplicaciones debe tener Activar aplicaciones de 32 bits establecido en verdadero y debe tener la versión x86 de la biblioteca

Marcos Meli
fuente
1
Funciona para mi. Simplemente da un mensaje de error sin señalar que falta la biblioteca C, lo cual es horrible.
brk
1
Para mí he instalado vcredist 2008 x64 para System.Data.SQLite, Version = 1.0.99.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139
themadmax el
5

Como alguien que tuvo que lidiar con bastantes informes de errores en Roadkill Wiki con exactamente el mismo problema, esto es lo que debe hacer:

  • ¿Estás usando x64 o x86? Sqlite viene con DLL para arquitecturas separadas: copie la correcta en su carpeta bin, hay dos DLLS para el proveedor oficial:System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Si no puede molestarse en buscar estos ensamblajes, habilite el modo de 32 bits para su grupo de aplicaciones (una solución para máquinas de desarrollo por lo general)
  • Si aloja en un servidor, necesitará el tiempo de ejecución de Microsoft C ++ redistribuible; no está instalado en Server 2008 R2 de forma predeterminada. versión x64 , versión x86

Es una verdadera pena saber cuántos aros tienes que atravesar al redistribuir los binarios de SQLite .NET, mi solución para Roadkill al final fue copiar los binarios correctos a la carpeta ~ / bin según la arquitectura que estás usando . Desafortunadamente, eso no resuelve el problema del tiempo de ejecución de C ++.

Chris S
fuente
5

Resolví esto instalando System.Data.SQLite con la extensión Nuget. Esta extensión se puede usar para Visual Studio 2010 o superior. Primero, debe instalar la extensión Nuget. Puedes seguir aquí:

  • Vaya a Visual Studio 2010, Menú -> Herramientas
  • Seleccionar administrador de extensiones
  • Ingrese NuGet en el cuadro de búsqueda y haga clic en Galería en línea. Esperando Recuperar información ...
  • Seleccione el Administrador de paquetes NuGet recuperado, haga clic en Descargar. Esperando Descargar ...
  • Haga clic en Instalar en el Administrador de paquetes NuGet del instalador de extensiones de Visual Studio. Espera a que se complete la instalación.
  • Haga clic en Cerrar y 'Reiniciar ahora.

En segundo lugar, ahora puede instalar SQLite:

Y ahora, puede usar System.Data.SQLite.

En el caso, verá dos carpetas x64 y, x86, estas carpetas contienen SQLite.Interop.dll. Ahora vaya a las ventanas de propiedades de esos dlls y configure la acción de compilación como contenido y Copiar al directorio de salida es Copiar siempre.

Entonces, ese es mi camino.

Gracias. Kim Tho Pham, Ciudad Ho Chi Minh, Vietnam. Correo electrónico: [email protected]

Kim Thọ Phạm
fuente
4

El ensamblaje System.Data.SQLite relacionado con la carga manual puede resolver esto.

Cambió el código de gatapia de la siguiente manera:

    public static void LoadSQLLiteAssembly()
    {
        Uri dir = new Uri(Assembly.GetExecutingAssembly().CodeBase);
        FileInfo fi = new FileInfo(dir.AbsolutePath);
        string appropriateFile = Path.Combine(fi.Directory.FullName, GetAppropriateSQLLiteAssembly());
        Assembly.LoadFrom(appropriateFile);
    }

    private static string GetAppropriateSQLLiteAssembly()
    {
        string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
        string arch = ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? "32" : "64");
        return "System.Data.SQLite.x" + arch + ".DLL";
    }
lxwwqw
fuente
4

Recibí este error cuando nuestro servidor de Windows se convirtió del sistema operativo de 32 bits a 64 bits. El ensamblado que arrojó el error se configuró para compilar en modo x86 (es decir, modo 32). Lo cambié a "Cualquier CPU" y eso funcionó. Puede cambiar este valor haciendo lo siguiente:

haga clic derecho en el proyecto vaya a Properties -> Build -> Platform Target -> change to "Any CPU"

goku_da_master
fuente
1
Intenté usar System.Data.SQLite.dll de 32 bits y obtuve esta excepción cuando se ejecuta en una CPU de 64 bits. Cambié el objetivo de la plataforma de "Cualquier CPU" a "x86" e hizo que la excepción desapareciera. Me imagino que a menos que esté buscando maximizar el rendimiento, es mejor construir para el mínimo común denominador para que pueda ejecutarse en una CPU de 32 o 64 bits.
cdavidyoung
3

Resolví esto, por extraño que parezca, instalando System.Data.SQLite a través de la aplicación Nuget GUI, en lugar de la consola del administrador de paquetes.

La instalación a través de la consola no incluía las dependencias que esta biblioteca necesita para ejecutarse.

JMK
fuente
3

System.Data.SQLitedepende de System.Data.SQLite.interopasegurarse de que ambos paquetes tengan la misma versión y sean ambos x86 .

Esta es una vieja pregunta, pero probé todo lo anterior. Estaba trabajando en un proyecto estrictamente x86 , por lo que no había dos carpetas / x86, / x64. Pero por alguna razón, la System.Data.SQLiteversión era diferente System.Data.SQLite.interop, una vez que bajé los dlls coincidentes, se solucionó el problema.

Flujo de apiladores
fuente
1

Se me ocurrieron 2 soluciones rápidas. O trabajas para mí. Creo que el problema se debe a los permisos.

1) En lugar de usar el archivo Elmah.dll del directorio net-2.0, utilicé Elmah.dll de net-1.1.

2) En lugar de mantener Elmah.dll en el directorio bin del proyecto. Hago un directorio dll para ponerlo.

Luego
fuente
1

Otra forma de evitar esto es simplemente actualizar su aplicación a ELMAH 1.2 en lugar de 1.1.

Peter Bernier
fuente
0

¿Puede eliminar su carpeta de depuración bin y volver a compilar?

O verifique la referencia de su proyecto a System.Data.SQLite, localice dónde está ubicado, luego abra el dll en el reflector. Si no puede abrirlo, eso significa que el dll está dañado, es posible que desee encontrar uno correcto o reinstalar el marco .net.

Graviton
fuente
Intenté agregar la referencia a System.Data.SQLite directamente (aparte de eliminar bin y obj) y obtuve este error: Error 1 Advertencia como error: Generación de ensamblado: ensamblado referenciado 'System.Data.SQLite.dll 'apunta a un procesador diferente MyProject
pupeno
0

Si está utilizando IIS Express como servidor web en su máquina de desarrollo, cambiaría a IIS local. Esto funcionó para mí.

cyclo_magic
fuente
0

Esta es una publicación antigua, pero puede ayudar a algunas personas que buscan este error intentar configurar "Habilitar aplicaciones de 32 bits" en Verdadero para el grupo de aplicaciones. Eso es lo que resolvió el error para mí. Encontré esta solución leyendo algunos comentarios a la respuesta de @ beckelmw.

MichaelD
fuente
0

Es probable que tenga instalado el paquete incorrecto. Desea el paquete producido por Microsoft que implementa el modelo de proveedor System.Data.Common.

pimbrouwers
fuente