Pregunta

He instalado ELMAH 1.1 .Net 3.5 x64 en mi proyecto ASP.NET y ahora estoy recibiendo este error (siempre trato de ver cualquier página):

  

No se pudo cargar el archivo o ensamblado   'System.Data.SQLite, versión = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una de sus dependencias. Un intento   se hizo para cargar un programa con una   formato incorrecto.

     

Descripción: Un   Excepción no controlada   la ejecución de la web actual   solicitud. Por favor 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: Could   No cargar el archivo o ensamblado   'System.Data.SQLite, versión = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una de sus dependencias. Un intento   se hizo para cargar un programa con una   formato incorrecto.

Más detalles del error en la parte inferior.

Mi plataforma de soluciones activas es "Cualquier CPU" y estoy corriendo en un x64 de Windows 7 en un x 64, por supuesto, el procesador. La razón por la que estamos utilizando esta versión de ELMAH se debe a 1.0 .Net 3.5 (x86, que es la única plataforma para la que es compilado) nos dio este mismo error en nuestro servidor de 64 bits de Windows.

He intentado compilar para x86 y x64 y me sale el mismo error. He intentado quitar la salida de todos compilador (bin y obj). Por último, me he hecho una referencia a la dll SQLite directamente, algo que no era necesario para que el proyecto funciona en el servidor y tengo este error del compilador:

  

Error 1 Advertencia como Error: generación Asamblea - Asamblea objetivos 'System.Data.SQLite.dll' un procesador diferente MyProject de Referencia

Cualquier idea lo que el problema podría ser?

Más detalles de error:

  

Fuente de error:

     

fue generado una excepción no controlada   durante la ejecución de la corriente   solicitud web. La información relativa a la   origen y la ubicación de la excepción   puede ser identificado usando la excepción   Seguimiento de la pila a continuación.

     

Seguimiento de la pila:

     

[BadImageFormatException: No se pudo   archivo de carga o montaje   'System.Data.SQLite, versión = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una de sus dependencias. Un intento   se hizo para cargar un programa con una   formato incorrecto.]
  System.Reflection.Assembly._nLoad (AssemblyName   nomArchivo, Cadena codeBase, Evidencia   assemblySecurity, Asamblea   locationHint, y StackCrawlMark   stackMark, Boolean   throwOnFileNotFound, Boolean   forIntrospection) +0
  System.Reflection.Assembly.nLoad (AssemblyName   nomArchivo, Cadena codeBase, Evidencia   assemblySecurity, Asamblea   locationHint, y StackCrawlMark   stackMark, Boolean   throwOnFileNotFound, Boolean   forIntrospection) 43
  System.Reflection.Assembly.InternalLoad (AssemblyName   assemblyRef, Evidencia   assemblySecurity, y StackCrawlMark   stackMark, Boolean forIntrospection)   127 System.Reflection.Assembly.InternalLoad (String   assemblyString, Evidencia   assemblySecurity, y StackCrawlMark   stackMark, Boolean forIntrospection)   142 System.Reflection.Assembly.Load (String   assemblyString) 28
  System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String   assemblyName, Boolean starDirective)   46

     

[ConfigurationErrorsException: ¿Podría   No cargar el archivo o ensamblado   'System.Data.SQLite, versión = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una de sus dependencias. Un intento   se hizo para cargar un programa con una   formato incorrecto.]
  System.Web.Configuration.CompilationSection.LoadAssemblyHelper (String   assemblyName, Boolean starDirective)   613 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory ()   203 System.Web.Configuration.CompilationSection.LoadAssembly (AssemblyInfo   ai) 105
  System.Web.Compilation.BuildManager.GetReferencedAssemblies (CompilationSection   compConfig) 178
  System.Web.Compilation.BuildProvidersCompiler..ctor (rutaDeAccesoVirtual   configPath, Boolean   supportLocalization, Cadena   outputAssemblyName) 54
  System.Web.Compilation.ApplicationBuildProvider.GetGlobalAsaxBuildResult (booleano   isPrecompiledApp) 232
  System.Web.Compilation.BuildManager.CompileGlobalAsax ()   52 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled ()   337

     

[HttpException (0x80004005): No se pudo   archivo de carga o montaje   'System.Data.SQLite, versión = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una de sus dependencias. Un intento   se hizo para cargar un programa con una   formato incorrecto.]
  System.Web.Compilation.BuildManager.ReportTopLevelCompilationException ()   58 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled ()   512 System.Web.Hosting.HostingEnvironment.Initialize (ApplicationManager   appmanager, IApplicationHost apphost,   IConfigMapPathFactory   configMapPathFactory,   HostingEnvironmentParameters   hostingParameters) 729

     

[HttpException (0x80004005): No se pudo   archivo de carga o montaje   'System.Data.SQLite, versión = 1.0.61.0,   Culture = neutral,   PublicKeyToken = db937bc2d44ff139' o   una de sus dependencias. Un intento   se hizo para cargar un programa con una   formato incorrecto.]
  System.Web.HttpRuntime.FirstRequestInit (HttpContext   contexto) +8896783
  System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext   contexto) 85
  System.Web.HttpRuntime.ProcessRequestInternal (HttpWorkerRequest   wr) 259

¿Fue útil?

Solución

System.Data.SQLite.dll es un conjunto de mezclado, es decir, que contiene tanto el código como código nativo gestionados. Por lo tanto un System.Data.SQLite.dll particular es x86 o x64, pero nunca ambos.

Actualizar ( cortesía J. Pablo Fernández ): Cassini, el servidor web de desarrollo utilizado por Visual Studio cuando se pulsa F5 o haga clic en el «juego» botón verde, es Sólo 86 lo que significa que incluso si su estación de trabajo es de 64 bits, sólo se podrá utilizar la versión x86 de System.Data.SQLite.dll.

Una alternativa no es el uso de Cassini, pero IIS7 que es propiamente x64.

Otros consejos

Asegúrese de que "Habilitar 32 - Aplicaciones de bit". Se establece en false para el grupo de aplicación

Ir a la IIS7 Application Pool -> advanced settings and set the 32-bit application to true.

Esto es muy simple, si usted no está utilizando SQLite:

Puede eliminar los archivos DLL SQLite desde carpetas bin de su solución, a continuación, desde la carpeta donde se hace referencia a ELMAH. Reconstruir, y su aplicación no intentará cargar este archivo DLL que no se está utilizando.

Tengo una máquina dev 64 bits y 32 bits servidor de compilación. He utilizado este código antes de la inicialización NHibernate. Funciona un encanto en cualquier arquitectura (bien el 2 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";
        }

Como alguien que ha tenido que hacer frente a un buen número de informes de errores sobre Roadkill Wiki con exactamente el mismo problema, esto es lo que hay que hacer:

  • ¿Está utilizando x64 o x86? SQLite viene con DLL para arquitecturas separadas - copiar la correcta a la carpeta bin, hay dos DLLS para el proveedor oficial: System.Data.SQLite.dll System.Data.SQLite.Linq.dll
  • Si no puede ser molestado en torno a la caza de estas asambleas, habilitar el modo de 32 bits para su grupo de aplicaciones (una solución para máquinas dev por lo general sólo)
  • Si usted es el anfitrión en el servidor, necesitará el redistribuible de Microsoft C ++ Runtime - no está instalado en el servidor 2008 R2 de forma predeterminada. x64 versión , versión x86

Es un verdadero dolor en el culo cuántos aros que tiene que saltar a través de cuando se re-distribuir los binarios NET SQLite, mi solución para Roadkill al final fue para copiar los binarios correctos a la carpeta ~ / bin basado en el arquitectura de su uso. Por desgracia, eso no resuelve el problema de tiempo de ejecución C ++.

I resuelto este mediante la instalación de System.Data.SQLite con extensión Nuget. Esta extensión puede utilizar para Visual Studio 2010 o superior. En primer lugar, usted tiene que instalar la extensión Nuget. Puede seguir aquí:

  • Ir a Visual Studio 2010, Menú -> Herramientas
  • Seleccione Administrador de extensiones
  • Introduzca NuGet en el cuadro de búsqueda y haga clic en Galería en línea. Esperando que Recuperar información ...
  • Seleccione el recuperado NuGet Administrador de paquetes, haga clic en Descargar. Esperando que descargar ...
  • Haga clic en Instalar en el Administrador de Visual Studio Extensión instalador NuGet paquete. Esperar a que se complete la instalación.
  • Haga clic en Cerrar y 'Volver a empezar ahora.

En segundo lugar, ahora, puede instalar SQLite:

Y ahora, puede utilizar System.Data.SQLite.

En el caso, se ven dos carpeta x64 y x86, estas carpetas contienen SQLite.Interop.dll. Ahora ve a las ventanas de propiedades de los archivos DLL y establecer medidas de construcción es el contenido y copiar al directorio de salida es siempre copia.

Por lo tanto, es mi camino.

Gracias. Kim Tho Pham, Ciudad de Ho Chi Minh, Vietnam. E-mail: tho.phamkim@gmail.com

Montaje de System.Data.SQLite relacionados con la carga manual puede resolver este problema.

Código de la siguiente manera gatapia Cambiado:

    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";
    }

Tengo este error cuando nuestro servidor de ventanas se convirtió de SO de 32 bits a 64 bits. El conjunto que fue lanzando el error se estableció para compilar en modo x86 (es decir, 32 modo). Me cambié a "Cualquier CPU" y que hizo el truco. Puede cambiar este valor mediante el procedimiento siguiente:

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

En nuestro caso no funcionó porque nuestro servidor de producción ha desaparecido

Microsoft Visual C ++ 2010 SP1 Redistributable Package (x86)

Lo instalamos y todo el trabajo bien. El grupo de aplicaciones debe tener Habilitar aplicaciones de 32 bits establecidos a true y se tiene que la versión x86 de la biblioteca

resolví esto, por extraño que parezca, mediante la instalación de System.Data.SQLite través de la aplicación Nuget interfaz gráfica de usuario, en contraposición a la consola del gestor de paquetes.

Instalación a través de la consola no incluye las dependencias de esta biblioteca necesita para funcionar.

Se me ocurrió con 2 soluciones rápidas. O bien trabajar para mí. Creo que el problema se debe a permisos.

1) En lugar de utilizar el archivo desde el directorio Elmah.dll 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 en.

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

System.Data.SQLite tiene una dependencia en System.Data.SQLite.interop asegúrese de que ambos paquetes son la misma versión y son a la vez 86 .

Esta es una vieja pregunta, pero traté de todo lo anterior. Yo estaba trabajando en un estricto Proyecto X 86, así que no había dos carpetas / 86, / 64. Pero por alguna razón, el System.Data.SQLite era una versión diferente a System.Data.SQLite.interop, una vez que bajé a juego dlls el problema se solucionó.

¿Se puede eliminar la carpeta bin de depuración y volver a compilar de nuevo?

O comprobar su referencia de proyecto al System.Data.SQLite, localizar a la que pertenece, a continuación, abra el archivo DLL en el reflector. Si no puede abrirlo, eso significa que la DLL está dañado, es posible que desee encontrar una correcta o volver a instalar el .NET Framework.

Si está utilizando IIS Express como el servidor web en el equipo de desarrollo que cambiaría a IIS local. Esto funcionó para mí.

Esta es una entrada antigua, pero puede ayudar a algunas personas que buscan en este error al intentar establecer "permiten que las aplicaciones de 32 bits" True para el grupo de aplicación. Eso es lo que resuelve el error para mí. Me encontré con esta solución mediante la lectura de algunos de los comentarios a la respuesta de @ beckelmw.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top