.net - studio - Nuevos conjuntos mixtos de SQLite
xamarin forms local storage (4)
En máquinas de 64 bits, una aplicación .NET dirigida AnyCPU no puede cargar archivos DLL de 32 bits. Es probable que deba establecer el destino de la plataforma de su aplicación .NET en x86 para que funcione tanto en las máquinas de 64 bits como en las de 32 bits.
Editar : bajo el capó, la razón por la que no se puede cargar el DLL de Interop es probablemente debido a una BadImageFormatException
debido a la falta de correspondencia del bit con el archivo DLL SQLite nativo.
Anteriormente, las bibliotecas .NET SQLite estaban disponibles desde http://sqlite.phxsoftware.com
, pero el equipo principal de SQLite se las ha encargado recientemente y han movido la página de descarga de System.Data.SQLite . Los nuevos paquetes ya no parecen contener ensambles mixtos (ensamblaje único que contiene sqlite3.dll y el contenedor .NET).
El nuevo paquete viene con .NET DLL y SQLite.Interop.dll
que, según la documentación, no se necesita en el escritorio, pero mi aplicación no se carga con Unable to load DLL ''SQLite.Interop.DLL'': The specified module could not be found.
. He intentado ejecutar la aplicación en IIS / IIS Express con el conjunto de aplicaciones configurado en 32 bits.
He intentado copiar el archivo SQLite.Interop.dll
en la carpeta bin
, la carpeta del sistema y la carpeta temporal ASP.NET, pero todavía recibo el mismo error.
¿Hay montajes mixtos para nuevas versiones disponibles en cualquier lugar? De lo contrario, ¿hay alguna forma de corregir el error Unable to load DLL ''SQLite.Interop.DLL
?
Encontré la solución. El problema se debió a un problema conocido con SQLite.Interop.dll.
Esta es la solución de eso funcionó para mí.
El uso de Dependency Walker desde http://dependencywalker.com/ para ver SQLite.Interop.dll (x86 y x64) muestra que depende de MSVCR100.dll.
La versión 1.0.66.0 anterior de System.Data.SQLite.dll no tiene esta dependencia. Con la compilación actual, tendríamos que redistribuir ese MSVCR100.dll también o ejecutar un instalador de Microsoft.
Solución: De: Missing msvcr100.dll
Use enlaces estáticos. En el proyecto SQLite.Interop Visual Studio. Vaya a esta configuración de Propiedades: Proyecto -> Propiedades -> Propiedades de configuración -> C / C ++ -> Generación de código -> Biblioteca de tiempo de ejecución y cambie el valor a Multihebra (/ MT). (El código fuente actual (1.0.71.0) tiene DLL de varios subprocesos (/ MD) que hace que el archivo dll confíe en MSVCR100.dll y que DLLImport (y LoadLibary ()) fallen cuando los usuarios no lo tienen.
Creo que la vinculación estática debería modificarse, por lo que es la predeterminada para SQLite.Interop.dll.
La página de descargas ahora contiene descargas de "modo mixto" para todas las variaciones de System.Data.SQLite, que funcionan de la misma manera que las versiones anteriores de SQLite, es decir, no es necesario incluir también SQLite.Interop.dll en su proyecto.
El truco es - busque la palabra "paquete" en los enlaces de descarga
por ejemplo, sqlite-netFx35-setup- bundle -x86-2008-1.0.76.0.exe
También verá que el texto de descripción para estos enlaces comienza con "Este paquete de instalación presenta el ensamblaje de modo mixto" .
Me quemé porque no me di cuenta de que esto realmente significa "descargar este si quieres que funcione de la forma en que siempre lo hacía antes" .
Al no tener idea de lo que significaba un ensamblaje de modo mixto, los otros enlaces parecían una mejor opción, porque dicen "Este paquete de instalación instalará todas las dependencias y componentes de tiempo de ejecución necesarios".
También tenga en cuenta que la única forma de saber si ha obtenido el "incorrecto" es por tamaño de archivo . Los archivos DLL tienen exactamente el mismo nombre y exactamente el mismo número de versión. La versión en modo mixto es mucho más grande: alrededor de 700K . El otro es alrededor de 160K.
Que desastre...
Tuve el mismo problema, en un complemento para una aplicación diferente. En mi caso, lo resolví modificando la variable de entorno PreLoadSQLite_BaseDirectory antes de hacer referencia a SQLite por primera vez.
// Make SQLite work... (loading dll from e.g. x64/SQLite.Interop.dll)
System.Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
Sql.Data.SQLite...
Sin embargo, no veo por qué era necesario, ya que pensé que PreLoadSQLite_BaseDirectory
(bueno, la variable interna correspondiente) sería la ubicación predeterminada del archivo System.Data.SQLite.dll
.