c# - studio - System.Data.SQLite de NuGet, interop dll no se copia al directorio de salida
sqlite.interop.dll'' no se puede encontrar el módulo especificado (9)
Con el paquete System.Data.SQLite.Core
NuGet versión 1.0.104, tuve el mismo problema que @ Eternal21 y @Patrick. Es decir, el proyecto A hace referencia a SQLite y el proyecto B hace referencia a donde SQlite.Interop.dll
no se copia en el directorio de salida de B.
Encontré una solución que resuelve el problema en el proyecto A en lugar de B, que es una solución más robusta, ya que soluciona el problema una vez para todos los proyectos futuros que se refieren a A. El archivo .targets del paquete NuGet contiene la siguiente sección:
<ItemGroup Condition="''$(ContentSQLiteInteropFiles)'' != '''' And
''$(ContentSQLiteInteropFiles)'' != ''false'' And
''@(SQLiteInteropFiles)'' != ''''">
<Content Include="@(SQLiteInteropFiles)">
<Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
Esta sección agrega SQLite.Interop.dll
como una referencia que debe copiarse a la salida del proyecto A y también a la salida de proyectos referentes (como B). Pero la propiedad MSBuild ContentSQLiteInteropFiles
no está definida de forma predeterminada (no sé por qué) deshabilitando la referencia por la primera condición. Para habilitarlo, agregué la siguiente línea a un elemento PropertyGroup
del archivo .csproj
de proyectos A:
<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
Tenga en cuenta que esta línea debe prececar el elemento Import
para el archivo .targets del paquete NuGet.
Instalé System.Data.SQLite Core (x86 / x64) de NuGet . Se construyó sin advertencias, pero lanzó System.DllNotFoundException
respecto a SQLite.Interop.dll
. SQLite.Interop.dll
mis proyectos para copiar el SQLite.Interop.dll
desde debajo del directorio del paquete de NuGet al directorio de salida, y ahora se ejecuta sin la excepción.
¿Por qué el paquete NuGet no configuró mis proyectos para colocar la dll de interoperabilidad adecuada en el directorio de salida? Parece que debería ser capaz de hacer eso.
Soy nuevo en la interoperabilidad y heredé esta base de código, que anteriormente hacía referencia a System.Data.SQLite.dll
directamente por ruta. Cambié a NuGet para deshacerme de las advertencias sobre una falta de coincidencia entre la arquitectura del procesador del proyecto frente a System.Data.SQLite
. Estoy tratando de construir todos los proyectos como AnyCPU.
Copia esto a tu archivo de proyecto:
<PropertyGroup>
<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
<CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
<CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
<CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
</PropertyGroup>
En mi caso, el SQL.Interop.dll no fue copiado por Nuget de ninguna manera, manualmente puso la versión correcta de la DLL en las carpetas x86 y x64 solucionó el problema.
Si ha instalado Sqlite de Nuget, puede encontrar el archivo SQL.Interop.dll en esta carpeta (para .NET 4.0)
PROJECT_FOLDER/packages/System.Data.SQLite.Core.1.0.*.*/build/net40
En mi caso, el archivo myProject.csproj
no tenía definido el System.Data.SQLite.Core.targets
. SQLite.Interop.dll
la siguiente línea y x86
versiones x64
y x86
de SQLite.Interop.dll
ahora se copian para todos los objetivos de compilación.
<Import Project="../packages/System.Data.SQLite.Core.1.0.98.1/build/net45/System.Data.SQLite.Core.targets" Condition="Exists(''../packages/System.Data.SQLite.Core.1.0.98.1/build/net45/System.Data.SQLite.Core.targets'')" />
No estoy seguro de qué ocurrirá cuando se actualice el paquete NuGet para System.Data.SQLite.Core
y si la ruta del paquete deberá modificarse manualmente.
En mi caso, el problema fue el hecho de que estaba usando SQLite dentro de un proyecto de biblioteca de clases que luego fue utilizado por otro proyecto WPF (tipo gui).
Resolvió el SQL.Interop.dll que no se copiaba en el directorio de salida, usando el siguiente comando Post-Build, dentro de Propiedades del proyecto -> Eventos de compilación:
xcopy "$(SolutionDir)packages/System.Data.SQLite.Core.1.0.101.0/build/net451/x86/SQLite.Interop.dll" "$(OutputDir)" /y /f
/y overwrites
/f displays actual filenames being copied
Ninguna de las respuestas anteriores pareció funcionar para mí, tal vez porque estoy en VS2015, pero me pareció una buena razón para agregar mi propia solución a este problema.
Mi situación específica es la misma que la de @ Eternal21: tengo una interfaz de usuario de WPF que consume una biblioteca cliente que es la que tiene SQLite agregado a través de nuget. Y, sí, el problema fue que el Interop.dll no se copió en la aplicación de inicio (es decir, la interfaz de usuario de WPF que no tiene instalado SQLite).
La solución de simplemente agregar SQLite al proyecto WPF usando nuget es una solución rápida y fácil si tiene prisa.
Mi solución de mano dura usa XCOPY pero tiene la ventaja de copiar los directorios x86 y x64 y también hace frente a las versiones de depuración y lanzamiento. Su inconveniente es que contiene nombres de proyecto codificados. Puedo ver cómo puedes usar una macro para deshacerte de la primera, pero no puedo ver fácilmente cómo deshacerte de la segunda, así que tendrías que cambiarla manualmente si el nombre del proyecto cambia (pero esto es bastante raro) ).
Mi solución es usar estos comandos XCOPY en la construcción posterior del proyecto de inicio:
xcopy $(SolutionDir)DALProject/bin/$(ConfigurationName)/x64/SQLite.Interop.dll $(SolutionDir)WPFProject/bin/$(ConfigurationName)/x64/*.* /C /F /S /E /Y
xcopy $(SolutionDir)DALProject/bin/$(ConfigurationName)/x86/SQLite.Interop.dll $(SolutionDir)WPFProject/bin/$(ConfigurationName)/x86/*.* /C /F /S /E /Y
/ C: continúa la copia, incluso si hay un error (tal vez no sea necesario).
/ F: muestra las rutas completas de los archivos que se están copiando (podría omitirse para limpiar la salida de la compilación).
/ S: copia los subdirectorios (que era la única forma en que podía crear los directorios / x86 y / x64).
/ E - Copia directorios y subdirectorios (tal vez duplicados / S).
/ Y: suprime el mensaje si el archivo de destino ya existe.
Configuré esto para que se ejecute solo en una compilación exitosa y funciona muy bien para mí. Espero que ayude a alguien.
Pensé que esto estaba sucediendo, ya que estaba copiando los archivos de mi carpeta de salida a otra ubicación cuando los implementé. Me faltó el hecho de que los archivos de interoperabilidad FUERON copiados, pero se copian en las carpetas x64 y x86 dentro de la carpeta de salida.
Si ejecuta msbuild en la depuración del proyecto, puede buscar referencias al destino CopySQLiteInteropFiles
para asegurarse de que se está ejecutando.
Tengo un proyecto DLL que usa el paquete SQLite de nuget pero un proyecto de prueba para él siempre generaría la excepción DLL no encontrada.
La solución más sencilla que encontré fue agregar también el paquete de nuget SQLite al proyecto de prueba.
en mi caso, usando NuGet para instalar SQLite y aún necesito agregar manualmente SQliteinterop.dll como un recurso. Luego construyo muy proyecto y cuando lo publico funciona bien. (Trabajando con configuración x86)