Periódicamente recibo la siguiente excepción:
Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Estoy usando 1.0.82.0. versión, instalándolo con nuget en VS2010, OS Win7 64.
Una vez que la excepción comienza a aparecer, aparece constantemente: en depuración y lanzamiento y ejecución de aplicaciones dentro o fuera de VS.
La única forma de detenerlo es cerrar sesión e iniciar sesión. La excepción no se produce y se carga dll. Puede funcionar durante días, pero luego puede romperse nuevamente.
¿Alguien ha visto algo como esto y hay una solución para ello?
Respuestas:
Sé que llego tarde a la fiesta, pero tuve este problema justo después de que saqué el último x86 / x64 hoy (versión 1.0.88.0). Mi IIS local en VS2012 ejecuta 32 bits por defecto y no hay una manera fácil de cambiar a x64. Mi servidor de producción funciona con 64 bits.
De todos modos instalé el paquete NuGet en un proyecto DLL y recibí este error. Lo que tuve que hacer para que funcionara también tuve que instalarlo en el proyecto del sitio principal . Incluso si no toca las clases de SQLite en absoluto.
Supongo que SQLite usa el ensamblado de entrada para detectar qué versión de Interop cargar.
fuente
Tuve este problema porque un dll que estaba usando tenía Sqlite como dependencia (configurado en NuGet con solo el paquete central de Sqlite). El proyecto compila y copia todos los dll-s de Sqlite excepto el 'SQLite.Interop.dll' (carpeta x86 y x64).
La solución fue muy simple: simplemente agregue el paquete Sqlite.Core como una dependencia (con NuGet) al proyecto que está creando / ejecutando y se copiarán los dll-s.
fuente
Tuve este mismo problema al usar SQLite en un proyecto WPF cuyo objetivo de plataforma era
Any CPU
. Lo arreglé siguiendo los siguientes pasos:prefer 32-bit
opción.Alternativamente, puede establecer el objetivo de la plataforma en
x86
ox64
. Creo que este problema es causado por elSystem.Data.SQLite
biblioteca que usa el objetivo de la plataforma para obtener la ubicación del archivo 'SQLite.Interop.dll'.ACTUALIZAR:
En caso de que no se pueda acceder al diseñador del proyecto, simplemente abra el
*.csproj
archivo project ( ) desde un editor de texto y agregue el valor<Prefer32Bit>false</Prefer32Bit>
a la<PropertyGroup>...</PropertyGroup>
etiqueta.Código de ejemplo
fuente
.csproj
archivo ya estaba configuradofalse
, pero aún tenía el error.Así es como lo arreglé en mi proyecto.
Estaba funcionando, y cuando un colega envió sus cambios, recibí la excepción "No se puede cargar la DLL 'SQLite.Interop.dll'".
Difundiendo el archivo .csproj del proyecto, esto estaba en la versión que NO FUNCIONA:
Y esto es lo que tenía la versión WORKING:
Después de volver atrás, no recibí la excepción. Los archivos DLL se volcaron en las carpetas Debug \ x64 (etc.) apropiadas.
fuente
Entonces, después de agregar NuGet, la implementación no copia Interops. Puede agregar esto a su archivo csproj y debería corregir ese comportamiento:
Si busca en la fuente NuGet para SQLite, puede ver qué están haciendo específicamente. Esto me permitió realizar un despliegue trabajando con ASP.Net Core.
fuente
Cuando llegue a este estado, intente realizar una Reconstrucción de todo. Si esto soluciona el problema, es posible que tenga el mismo problema que tuve.
Algunos antecedentes (mi entendimiento) :
SQLite tiene 1 ensamblado administrado (System.Data.SQLite.dll) y varios ensamblados específicos de plataforma (SQLite.Interop.dll). Al instalar SQLite con Nuget, Nuget agregará los ensamblados específicos de la plataforma a su proyecto (dentro de varias carpetas: \ x86, \ x64) y configurará estos dlls para "Copiar siempre".
Tras la carga, el ensamblado administrado buscará ensamblados específicos de la plataforma dentro de las carpetas \ x86 y \ x64. Puedes ver más sobre eso aquí . La excepción es este ensamblado administrado que intenta encontrar el relevante (SQLite.Interop.dll) dentro de estas carpetas (y falla).
Mi escenario :
Tengo 2 proyectos en mi solución; una aplicación WPF y una biblioteca de clases. La aplicación WPF hace referencia a la biblioteca de clases, y la biblioteca de clases hace referencia a SQLite (instalado a través de Nuget).
El problema para mí fue que cuando modifico solo la aplicación WPF, VS intenta hacer una reconstrucción parcial (dándose cuenta de que el dll dependiente no ha cambiado). En algún lugar de este proceso, VS limpia el contenido de las carpetas \ x86 y \ x64 (eliminando SQLite.Interop.dll). Cuando hago una reconstrucción completa, VS copia correctamente las carpetas y su contenido.
Mi solución :
Para solucionar esto, terminé agregando un proceso posterior a la compilación usando xcopy para forzar la copia de las carpetas \ x86 y \ x64 de la biblioteca de clases a mi directorio de proyecto WPF \ bin.
Alternativamente, podría hacer cosas más sofisticadas con los directorios de configuración / salida de compilación.
fuente
Tuve el mismo problema al ejecutar Visual Studio Express 2013. Probé varias soluciones mencionadas aquí y en otros lugares en vano. Espero que esta solución ayude a otros.
Lo arreglé usando el
DeploymentItem
atributo en mi clase de prueba que prueba el servicio basado en SQLite.Ejemplo:
Esto hace que lo necesario
SQLite.Interop.dll
se copie en elx86
directorio dentro de la carpeta "TestResults" apropiada.Todo es verde Todo es bueno.
fuente
Actualizar NuGet desde
Tools -> Extension and updates
y reinstalar SQLite.Core con el comando loPM> Update-Package -reinstall System.Data.SQLite.Core
arregló para mí.fuente
Tuve un problema similar en una solución de proyectos múltiples. El SQLite.Interop.dll era necesario para uno de los complementos distribuidos con el software usando ClickOnce.
En cuanto a la depuración en Visual Studio, todo funcionó bien, pero a la versión implementada le faltaban las carpetas x86 / y x64 / que contenían esa DLL.
La solución para que funcione después de la implementación con ClickOnce fue crear en el proyecto de inicio de la solución (también la que se está publicando) estas dos subcarpetas, copiar en ellas las DLL y configurarlas como Content Copy Always.
De esta forma, la herramienta de publicación ClickOnce incluye automáticamente estos archivos y carpetas en el manifiesto e implementa el software con ellos.
fuente
Realmente hay muchas respuestas aquí, pero la mía es simple y clara sin jugar con GAC .
El problema era que el archivo ejecutable necesita una copia del derecho
SQLite.Interop.dll
(x86 o x64) para acceder a nuestra base de datos.La mayoría de las arquitecturas tienen capas y, en mi caso, la capa de datos tiene la DLL requerida para la conexión SQLite.
Así que simplemente puse un script posterior a la compilación en mi solución de capa de datos y todo funcionó bien.
TL; DR;
Establezca todos los proyectos de su solución en
x86
ox64
en las opciones de compilación.Agregue lo siguiente
Post-Build-Script
al Proyecto conSQLite nuget Package
:xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y
Por supuesto, debe cambiar el script
Release Build
y lasx86
compilaciones.STL; DR;
Pon tu al
SQLite.Interop.dll
lado del*.exe
archivo.fuente
La instalación predeterminada de la versión de arquitectura múltiple (x86, x64) de SQLite de NuGet exhibe el comportamiento que usted describió. Si desea cargar la versión correcta para la arquitectura real que el tiempo de ejecución de .NET eligió para ejecutar su aplicación en su máquina, puede darle al cargador de DLL una pista sobre dónde ubicar la biblioteca correcta de la siguiente manera:
Agregue una declaración para la llamada a la función kernel32.dll a SetDLLDirectory () antes de su Program.Main ():
Luego use su propio método para determinar el subdirectorio correcto para encontrar la versión específica de la arquitectura de 'SQLite.Interop.dll'. Yo uso el siguiente código:
fuente
incluso si es una publicación anterior, me gustaría compartir la solución que encontré aquí: http://system.data.sqlite.org/index.html/info/54e52d4c6f
Si no desea leer todo el problema, la solución es copiar el archivo "msvcr100.dll" (que se puede encontrar en el directorio Windows \ System32) en la misma ruta que SQLite.Interop.dll.
Le recomendaría leer el problema para comprender por qué, e incluir el archivo en su configuración, pero para instalarlo solo si se produce el error, lo convertí en un componente opcional seleccionable en las opciones de configuración.
HTH, Formentz
fuente
Como dice el wiki de SQLite , la implementación de su aplicación debe ser:
Entonces debes seguir las reglas. Encuentre dll que coincida con su plataforma de destino y colóquelo en la ubicación, se describe en la imagen. Dlls se puede encontrar en YourSolution / packages / System.Data.SQLite.Core.% Version% /.
Tuve problemas con la implementación de la aplicación, por lo que acabo de agregar SQLite.Interop.dll correcto en mi proyecto, la carpeta x86 agregada a AppplicationFolder en el proyecto de instalación y agregué referencias de archivo a dll.
fuente
También podría obtener este error si está intentando ejecutar un dll de 32 bits, en un proyecto de 64 bits.
Obtuve esto cuando coloqué el mismo archivo (SQLite.Interop.dll en la versión de 32 bits) en la carpeta x86 y x64.
fuente
Si descarga el binario correcto para
SQLite
, cópieloSQLite.Interop.dll
en su carpeta Release o Debug de acuerdo con la opción de compilación de su proyecto.fuente
No sé por qué esto aún no se ha incluido, pero tuve que investigar y descubrirlo por mí mismo, así que espero que alguien encuentre esta respuesta y se salve el problema. Esto fue para una aplicación WPF. Funcionó bien en mi caja Dev, pero no funcionó en la computadora donde la estaba copiando y obtuve el
Unable to load DLL 'SQLite.Interop.dll'
error. Trasporté todos sus directorios y archivos asociados, directamente desde mi carpeta "Debug" a esta otra computadora cuando recibí el mismo error que el OP cuando lo ejecuté. Mi carpeta "bin" que contenía mis archivos DLL se había copiado en "Debug \ bin" y se incluyeron todos, junto con mis archivos de aplicación cuando hice mi copia a la otra computadora usando esta ruta, por lo que no faltaba ningún archivo.Las cosas que vi dijeron en otras respuestas que no se aplicaban:
Lo que encontré fue esto, de https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :
El énfasis es mío en esa parte en negrita dentro del párrafo. La computadora de destino era nueva y no tenía programas cargados excepto .NET 4.0. Una vez que instalé C ++, pude completar los comandos para SQLite. Esta debería haber sido una de las primeras preguntas frecuentes y parte de los requisitos previos, pero fue enterrada en el n. ° 11. Mi computadora de desarrollo ya la tenía cargada porque venía con Visual Studio, por eso funcionó allí.
Descargar:
Visual C ++ Redistributable para Visual Studio 2015:
https://www.microsoft.com/en-us/download/details.aspx?id=48145
Actualización 3 (actualización acumulativa):
https://www.microsoft.com/en-us/download/details.aspx?id=53587
fuente
He comenzado a usar Costura.Fody para empaquetar (.net) ensamblajes e incrustar y precargar dlls nativos. Esto también ayuda más adelante, con la distribución, ya que puede enviar un archivo.
Instala Costura Fody desde Nuget.
En su proyecto C #, cree una carpeta llamada costrua32. Allí agregue cualquier dlls nativo que C # cargar.
Una vez que los haya agregado a esta carpeta. Haga clic en la ventana de propiedades y cambie la acción de compilación a "Recurso incorporado"
Finalmente, necesita modificar el archivo XML llamado FodyWeavers.xml de la siguiente manera. Aquí estoy especificando cargar el dll sql primero. (tenga en cuenta que suelta el .dll)
La ventaja de esto es que no tiene que escribir ningún evento previo o posterior a la compilación, y el producto final está totalmente encapsulado en un archivo más grande.
fuente
También agregó el dll al proyecto de prueba (a través de Nuget Manager) y lo arregló.
fuente
Tuve este problema porque Visual C ++ 2010 redistribuible no está instalado en mi PC. Si aún no ha instalado Visual c ++ 2010 redistributable Descargue e instale esto (verifique x86 o 64 dll).
fuente
Tengo el mismo problema. Sin embargo, finalmente, puedo arreglarlo. Actualmente, uso Visual Studio 2013 Community Edition. Solo uso Agregar-> Elemento existente ... y busco dónde están los archivos SQLite.Data.SQLite (mi caso es 'C: \ Archivos de programa (x86) \ System.Data.SQLite \ 2013 \ bin'). No olvide cambiar el tipo de lo que incluirá en Archivos de ensamblaje (* .dll; * .pdb) . Elija ' SQLite.Interop.dll ' en esa carpeta. A partir de ahí, puedo continuar sin ningún problema. Buena suerte a todos ustedes. ^ _ ^ PD. Creo una aplicación de formulario web. No lo he probado en la aplicación de formulario de ventana u otros todavía.
fuente
Intente establecer el objetivo de la plataforma en x86 o x64 (y no en cualquier CPU) antes de compilar: Proyecto-> Propiedades-> Compilar-> Destino de plataforma en Visual Studio.
fuente
Copie SQLite.Interop.dll en el directorio del proyecto.
fuente
He luchado con esto durante mucho tiempo y, ocasionalmente, descubrí que la configuración de prueba es incorrecta. Ver esta imagen:
Acabo de desmarcar la configuración de prueba y el problema desaparece. De lo contrario, se producirá la excepción. Espero que esto ayude a alguien. No estoy seguro de que sea la causa raíz.
fuente
Copie los archivos "SQLite.Interop.dll" para x86 y x64 en la carpeta de depuración. estos archivos deben copiarse en las carpetas "x86" y "x64 en la carpeta de depuración.
fuente
Mi aplicación es una aplicación web (ASP.NET MVC) y tuve que cambiar el grupo de aplicaciones para ejecutar en
LocalSystem
lugar deApplicationPoolIdentity
. Para hacer esto:LocalSystem
No tengo idea de por qué esto soluciona el problema.
fuente
No sé si es una buena respuesta, pero pude resolver este problema ejecutando mi aplicación bajo un AppDomain con una identidad de "Sistema local".
fuente
Estoy trabajando en una aplicación de consola simple para agregar algunos datos de prueba a una base de datos SQLite y recibí este error. La configuración para el proyecto es "Cualquier CPU". Lo arreglé copiando el SQLite.Interop.dll a la carpeta bin \ debug. Una mejor manera sería utilizar el método de @Wil, pero ¿cómo se especifica esto para la configuración de "Cualquier CPU"?
fuente
¿Podría haber contención para la asamblea? Verifique si hay otra aplicación con un bloqueo de archivo en la DLL.
Si esta es la razón, debería ser fácil usar una herramienta como el Explorador de procesos de Sysinternal para descubrir el programa ofensivo.
HTH, arcilla
fuente
Como referencia para cualquiera que esté mirando esta pregunta:
Si usa el paquete nuget, instala una regla de compilación que hace la copia por usted. (consulte la sección System.Data.SQLite.Core.1.0.94.0 \ build, o cualquier versión de Core que instale).
El instalador nuget agrega la regla a su archivo de proyecto automáticamente.
Sin embargo, esto todavía no soluciona el problema del caso de prueba. El enfoque DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) es lo único que parece funcionar allí.
fuente
Me encontré con este problema, en una solución con un proyecto web WebAPI / MVC5 y un proyecto de prueba de características, que derivaron del mismo proyecto de acceso a datos (o 'Core'). Yo, como tantos otros aquí, estoy usando una copia descargada a través de NuGet en Visual Studio 2013.
Lo que hice fue que en Visual Studio agregué una carpeta de solución x86 y x64 a la Prueba de características y Proyectos web. Luego hice un
Right Click | Add Existing Item...
, y agregué la biblioteca SQLite.interop.dll apropiada..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]
para cada una de esas carpetas. Entonces hice unRight Click | Properties
, y me puseCopy to Output Directory
aAlways Copy
. La próxima vez que necesitaba ejecutar mis pruebas de características, las pruebas se ejecutaron con éxito.fuente