来自NuGet的System.Data.SQLite,interop dll没有复制到输出目录

Vim*_*mes 17 .net c# sqlite interop visual-studio

从NuGet安装了System.Data.SQLite Core(x86/x64).它建立时没有任何警告,但投掷System.DllNotFoundExceptionSQLite.Interop.dll.我操纵我的项目将SQLite.Interop.dllNuGet包的目录下的副本复制到输出目录,现在它运行没有异常.

为什么NuGet包没有配置我的项目将相应的interop dll放在输出目录中?似乎它应该能够做到这一点.

我是interop的新手,我继承了这个以前System.Data.SQLite.dll直接由path 引用的代码库.我转而使用NuGet来摆脱有关项目处理器架构与之间不匹配的警告System.Data.SQLite.我正在尝试将所有项目构建为AnyCPU.

Ste*_*fan 13

将其复制到您的项目文件:

 <PropertyGroup> 
    <ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
    <CopySQLiteInteropFiles>false</CopySQLiteInteropFiles>
    <CleanSQLiteInteropFiles>false</CleanSQLiteInteropFiles>
    <CollectSQLiteInteropFiles>false</CollectSQLiteInteropFiles>
 </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

源:SQLite.Interop.dll文件在引用的项目需要时不会复制到项目输出路径

  • 有效!我花了6.5个小时才找到这个。 (3认同)

Ete*_*l21 6

就我而言,问题在于我在一个类库项目中使用SQLite,然后由另一个WPF(gui类型)项目使用.

解决了SQL.Interop.dll没有被复制到输出目录,在Project Properties - > Build Events中使用以下Post-Build命令:

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
Run Code Online (Sandbox Code Playgroud)


Ric*_*ard 5

我认为这是发生的,因为我在部署它们时将文件从输出文件夹复制到另一个位置.我错过了正在复制的互操作文件这一事实,但它们被复制到输出文件夹中的x64和x86文件夹.

如果在项目的debug中运行msbuild,则可以查找对CopySQLiteInteropFiles目标的引用以确保它正在运行.

  • 不适合我.我在运行时得到一个DllNotFoundException.您的所有项目都是AnyCPU吗? (3认同)
  • 在我的情况下,我不得不在启动项目中添加NuGet包引用.我们开发的其中一个插件使用Sqlite,但在该库上添加NuGet包却没有用.我不得不在主项目上添加它. (2认同)

小智 5

使用System.Data.SQLite.CoreNuGet 包版本 1.0.104,我遇到了与 @Eternal21 和 @Patrick 相同的问题。也就是说,项目 A 引用 SQLite,项目 B 引用 A,其中SQlite.Interop.dll未复制到 B 的输出目录中。

我找到了一个解决方案,可以解决项目 A 而不是 B 中的问题,这是一个更强大的解决方案,因为它可以为所有引用 A 的未来项目修复一次问题.targets。NuGet 包的文件包含以下部分:

<ItemGroup Condition="'$(ContentSQLiteInteropFiles)' != '' And
                      '$(ContentSQLiteInteropFiles)' != 'false' And
                      '@(SQLiteInteropFiles)' != ''">
  <Content Include="@(SQLiteInteropFiles)">
    <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

此部分添加SQLite.Interop.dll为引用,必须将其复制到项目 A 的输出以及引用项目(如 B)的输出。但 MSBuild 属性ContentSQLiteInteropFiles默认情况下未定义(我不知道为什么),从而禁用第一个条件的引用。为了启用它,我将以下行添加到PropertyGroup项目 A.csproj文件的元素中:

<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles>
Run Code Online (Sandbox Code Playgroud)

请注意,此行必须位于NuGet 包文件的Import元素之前。.targets