No se pudo cargar el archivo o ensamblado 'System.Data.SQLite'
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
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:
- Vaya al menú HERRAMIENTAS-> Biblioteca paquete Manager-> Gestor de paquetes de consola del estudio visual.
- A continuación, ejecute el comando Install-Package System.Data.SQLite en la consola de Administrador de paquetes. Me gusta esto: ejecute el comando Install-Package System.Data.SQLite en Gestor de paquetes de consola
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.