c# - visual - sqlite website




Imposible cargar DLL 'SQLite.Interop.dll' (20)

¿Podría haber contienda por la asamblea? Compruebe si hay otra aplicación con un bloqueo de archivos en la DLL.

Si este es el motivo, debería ser fácil usar una herramienta como Sysinternal's Process Explorer para descubrir el programa ofensivo.

HTH, Clay

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ándola con nuget en VS2010, OS Win7 64.

Una vez que la excepción comienza a aparecer, aparece constantemente: en la depuración y liberación y en la aplicación en ejecución dentro o fuera de VS.

La única forma de detenerlo es cerrar la sesión e iniciar sesión. La excepción no se lanza y se carga dll. Puede funcionar durante días, pero luego puede volver a romperse.

¿Alguien ha visto algo como esto y hay una solución para eso?


Actualizando NuGet desde Tools -> Extension and updates y reinstalando SQLite.Core con el comando PM> Update-Package -reinstall System.Data.SQLite.Core arregló por mí.


Como dice el wiki de SQLite , la implementación de su aplicación debe ser:

Entonces debes seguir las reglas. Busque dll que coincida con su plataforma objetivo y colóquelo en su 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, así que acabo de agregar SQLite.Interop.dll correcto en mi proyecto, la carpeta x86 añadida a AppplicationFolder en el proyecto de instalación y las referencias de archivos agregados a dll.


Como referencia para cualquiera que mire esta pregunta:

Si usa el paquete nuget, instala una regla de compilación que hace la copia por usted. (ver en System.Data.SQLite.Core.1.0.94.0 \ build - o la versión de Core que instales).

El instalador Nuget agrega la regla a su archivo de proyecto automáticamente.

Sin embargo, esto aún no soluciona el problema del caso de prueba. El enfoque DeploymentItem ( https://.com/a/24411049/89584 ) es lo único que parece funcionar allí.


Cuando llegue a este estado, intente realizar un Rebuild-All. Si esto soluciona el problema, puede tener 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 ensamblaje administrado buscará ensamblados específicos de la plataforma dentro de las carpetas \ x86 y \ x64. Puedes ver más sobre eso here . 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 modifiqué 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 un Rebuild-All completo, VS copia correctamente las carpetas y sus contenidos.

Mi solución :

Para solucionarlo, terminé agregando un proceso de Post-Build utilizando xcopy para forzar la copia de las carpetas \ x86 y \ x64 de la biblioteca de la clase a mi directorio WPF project \ bin.

Alternativamente, podría hacer cosas más elegantes con los directorios de configuración / salida de compilación.


Empecé a usar Costura.Fody para ensamblar paquetes (.net) e incrustar y precargar dlls nativos. Esto también ayuda más adelante, con la distribución, ya que puede enviar un archivo.

  1. Instala Costura Fody en Nuget.

  2. En su proyecto C #, cree una carpeta llamada costrua32. Ahí agregue cualquier dlls nativo que cargue C #.

  3. 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 incrustado"

  4. Finalmente, debe modificar el archivo XML llamado FodyWeavers.xml de la siguiente manera. Aquí estoy especificando cargar el sql dll primero. (nota que sueltas el .dll)

    Weavers
     Costura
      PreloadOrder
       SQLite.Interop
       tbb_debug
       tbb
      /PreloadOrder>
     /Costura
    /Weavers
    

La ventaja de esto es que no tiene que escribir ningún evento de compilación previo o posterior, y el producto final está totalmente encapsulado en un archivo más grande.


Encontré este problema yo mismo, pero resultó ser otra causa:

System.DllNotFoundException was caught 
Unable to load DLL 'SQLite.Interop.dll': Access is denied. 

En este caso, el código fue llamado (indirectamente) desde un servicio web alojado por IIS (configurado para la compilación x86). Finalmente lo rastreé hasta Application Pool en IIS: Originalmente estaba usando "ASP.NET V4.0 Integrated" (que resultó en ese error), pero cuando lo cambié a "DefaultAppPool" , el problema desapareció.

(¡Uf!)


Entonces, mi problema era que SQLite estaba intentando cargar en tiempo de diseño en WPF. Como solo me preocupaba el entorno x86, configuré la preferencia de CPU para eso y copié SQLite.Interop.dll del paquete Nuget al directorio raíz de la solución. Reinició la solución y todos los problemas desaparecieron. Entonces, si tiene problemas de tiempo de diseño, coloque la biblioteca en el directorio raíz de su solución.

Además, estaba obteniendo un problema similar durante el tiempo de ejecución, así que tuve que colocar una copia de SQLite.Interop.dll en mi proyecto y configurarlo para que sea más reciente en las propiedades. Parece que las carpetas x86 y x64 proporcionadas son completamente inútiles. Se necesita más investigación, pero en general ... es más fácil hacer una referencia manual a SQLite en su proyecto que utilizar un paquete Nuget.

Además, las preguntas frecuentes oficiales establecen lo siguiente:

(20) Cuando el proyecto System.Data.SQLite se compila y se ejecuta desde Visual Studio, ¿por qué obtengo una DllNotFoundException o una BadImageFormatException (para "sqlite3.dll" o "SQLite.Interop.dll") cuando intento ejecutar o depurar la aplicación?

Al compilar y ejecutar una solución desde Visual Studio que utiliza el proyecto System.Data.SQLite (incluido el proyecto de prueba), es muy importante seleccionar la plataforma y la configuración de compilación correctas. En primer lugar, las aplicaciones administradas para depurar dentro de Visual Studio no pueden usar el ensamblaje de modo mixto (es decir, porque siempre se compila en el directorio de salida de compilación específico de la plataforma). Esto es necesario para admitir correctamente binarios de construcción para plataformas múltiples utilizando los mismos archivos de proyecto fuente. Por lo tanto, solo se deben seleccionar las configuraciones de compilación "DebugNativeOnly" o "ReleaseNativeOnly" cuando se ejecuta una aplicación administrada desde Visual Studio que se basa en el ensamblado System.Data.SQLite. Estas configuraciones de compilación contienen un paso personalizado posterior a la compilación que copia el ensamblado nativo requerido al directorio de salida administrado (es decir, para permitir la ejecución de los binarios administrados en el lugar). Sin embargo, este paso posterior a la creación solo se realizará si la plataforma seleccionada coincide con la del sistema operativo (por ejemplo, "Win32" para Windows de 32 bits y "x64" para Windows de 64 bits). Por lo tanto, es una buena práctica verificar dos veces la plataforma de compilación seleccionada con el sistema operativo antes de intentar ejecutar un proyecto administrado en la solución.

https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20


He luchado con esto durante mucho tiempo y, ocasionalmente, descubrí que la configuración de la prueba es incorrecta. Ver esta imagen:

Simplemente desmarco la configuración de la prueba y el problema desaparece. De lo contrario, la excepción ocurrirá. Espero que esto ayude a alguien. No estoy seguro de que sea la causa raíz.


Intente establecer el destino de la plataforma en x86 o x64 (y no en ninguna CPU) antes de compilar: Proyecto-> Propiedades-> Compilar-> Objetivo de la plataforma en Visual Studio.


Me encontré con este problema, en una solución con un proyecto web WebAPI / MVC5 y un proyecto de prueba de funciones, que ambos se extrajeron del mismo proyecto de acceso a datos (o, 'Core'). Yo, como muchos otros aquí, estoy usando una copia descargada a través de NuGet en Visual Studio 2013.

Lo que hice fue que en Visual Studio se agregó una carpeta de solución x86 y x64 a la Prueba de funciones y Proyectos web. Luego hice un Right Click | Add Existing Item... Right Click | Add Existing Item... y agregue la biblioteca SQLite.interop.dll adecuada de ..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture] para cada una de esas carpetas . Luego hice un Right Click | Properties Right Click | Properties , y configure Copy to Output Directory para Always Copy . La próxima vez que necesité ejecutar mis pruebas de funciones, las pruebas se ejecutaron con éxito.


No sé por qué esto no se ha incluido aún, pero tuve que investigar y descubrir esto por mí mismo, así que con suerte alguien encontrará esta respuesta y se ahorrará el problema. Esto fue para una aplicación WPF. Funcionó bien en mi cuadro Dev, pero no funcionó en la computadora donde lo estaba copiando y Unable to load DLL 'SQLite.Interop.dll' error Unable to load DLL 'SQLite.Interop.dll' . Transmití 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 había sido copiada a "Debug \ bin" y todos fueron incluidos, junto con los archivos de mi 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 aplicaron:

  • No usé el paquete NuGet o necesito crear carpetas x86 o x64 que parece que el paquete NuGet crea. Mis archivos DLL (System.Data.SQLite y SQLite.Interop.dll, junto con System.Data.SQLite.config) están en la carpeta "bin" de mi proyecto y se copiaron de forma manual (crear la carpeta "bin" en el Explorador de soluciones en VS, pegue las DLL en esta carpeta en el Explorador de Windows, use Agregar> Elemento existente para traer archivos a la carpeta / proyecto VS). Luego los refiero como ensambles referenciados en mi proyecto usando esa ubicación ("Referencias"> "Agregar referencia", y navego a uno, enjuago, repito para el resto). Esto asegura que mi proyecto sepa exactamente dónde están.
  • No necesité hacer referencia a ningún archivo DLL de SQLite en mi app.config o incluso tocar mi archivo MyProject.csproj.
  • ¡Ni siquiera necesité especificar un procesador en particular! La compilación de mi proyecto es para "Cualquier CPU", aunque solo tengo DLL mixtos o de 64 bits y solo se ejecutará en Windows 7+, que son sistemas operativos de 64 bits. (no solo DLL de solo x86 / 32 bits)
  • Ya los estaba especificando como "Contenido" y "copiar si es más nuevo" para estos archivos DLL cuando experimenté el error del OP.

Lo que encontré fue esto, de https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :

(11) ¿Por qué obtengo una DllNotFoundException (para "sqlite3.dll" o "SQLite.Interop.dll") cuando intento ejecutar mi aplicación?

O la biblioteca de enlace dinámico (DLL) nombrada no se puede ubicar o no se puede cargar debido a dependencias faltantes. Asegúrese de que la biblioteca de enlace dinámico nombrada esté ubicada en el directorio de la aplicación o en un directorio a lo largo del sistema PATH y vuelva a intentarlo. Además, asegúrese de que se haya instalado la redistribución del tiempo de ejecución necesario de Visual C ++ a menos que esté utilizando una biblioteca de enlaces dinámicos que se haya creado de manera estática vinculada a ella.

Énfasis 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 a SQLite. Esta debería haber sido una de las primeras preguntas frecuentes y parte de las pre-requisitos, pero fue enterrada en el n. ° 11. Mi computadora de desarrollo ya la tenía cargada porque venía con Visual Studio, así que 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


Quería publicar aquí debido a la complejidad de este problema. Mi solución fue retroceder a .Net 4.0. He estado probando durante 3 días y no he podido obtener System.Data.SQLite.Core.1.0.98.0 para trabajar con .Net 4.5 o .Net 4.5.1.

La prueba fue exhaustiva en 3 computadoras, 2 servidores y una PC de desarrollo. No he podido llegar al origen del problema. He intentado editar el archivo .vsproj. He agregado el SQLite.interop.dll a todas las carpetas prácticamente. Apliqué el paquete a todas las carpetas de GAC y lo eliminé y volví a aplicar de forma individual. Eventualmente eliminado.

Tengo System.Data.SQLite.Core.1.0.98.0 trabajando con .Net 4.0. Tengo la intención de seguir intentando la migración, pero creo que comenzaré un nuevo proyecto primero y veré si puedo lograr que funcione de esa manera. Originalmente era una aplicación web .Net 3.5, y en mis viajes encontré una buena cantidad de información que aún hace referencia a ese marco.


Sé que llego tarde a la fiesta, pero tuve este problema justo después de sacar el último x86 / x64 de hoy (versión 1.0.88.0). Mi IIS local en VS2012 ejecuta 32 bits de manera predeterminada y no hay una manera fácil de cambiar a x64. Mi servidor de producción ejecuta 64 bits.

De todos modos, instalé el paquete NuGet en un proyecto DLL y obtuve este error. Lo que tenía que hacer para que funcione también tuve que instalarlo en el proyecto principal del sitio . Incluso si no toca las clases de SQLite en absoluto.

Supongo que SQLite usa el ensamblaje de entrada para detectar qué versión de Interop cargar.


También podría obtener este error si está intentando ejecutar un dll de 32 bits en un proyecto de 64 bits.

Lo obtuve cuando coloqué el mismo archivo (SQLite.Interop.dll en la versión de 32 bits) en la carpeta x86 y x64.


Tengo el mismo problema. Sin embargo, finalmente, puedo arreglarlo. Actualmente, uso Visual Studio 2013 Community Edition. Solo uso Add-> Existing Item ... y navego hasta donde 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 los 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. ^ _ ^ PS Creo aplicación de formulario web. Todavía no lo he intentado en la aplicación de formulario de ventana u otros.


Tuve el mismo problema al usar SQLite en un proyecto WPF cuyo objetivo de plataforma era Any CPU . Lo arreglé siguiendo los siguientes pasos:

  1. Abra el diseñador del proyecto en Visual Studio. Los detalles sobre cómo hacerlo se pueden encontrar here .
  2. Haga clic en la pestaña Construir.
  3. Desactiva la opción prefer 32-bit .

Alternativamente, puede establecer el objetivo de la plataforma en x86 o x64 . Creo que este problema está causado por la biblioteca System.Data.SQLite que utiliza el objetivo de la plataforma para obtener la ubicación del archivo 'SQLite.Interop.dll'.

ACTUALIZAR:

En caso de que no se pueda contactar al diseñador del proyecto, simplemente abra el archivo del proyecto ( *.csproj ) desde un editor de texto y agregue el valor <Prefer32Bit>false</Prefer32Bit> en la etiqueta <PropertyGroup>...</PropertyGroup> .

Código de ejemplo

<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>[Set by Visual Studio]</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>[Set by Visual Studio]</RootNamespace>
    <AssemblyName>[Set by Visual Studio]</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>[Set by Visual Studio]</FileAlignment>
    <!--Add the line below to your project file. Leave everything else untouched-->
    <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>

Tuve este problema porque Visual C ++ 2010 redistribuible no está instalado en mi PC. Si aún no ha instalado Visual c ++ 2010, redistribuible Download e instale esto (compruebe x86 o 64 dll).


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 utilizando 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 publica) estas dos subcarpetas, copiarlas en 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 y despliega el software con ellos.


incluso si se trata de 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.

Aconsejaría leer el tema para comprender por qué, e incluir el archivo en su configuración, pero para instalarlo solo si ocurre el error, lo convertí en un componente opcional seleccionable en las opciones de configuración.

HTH, Formentz





sqlite