c - 如何使 SqLite 在 Windows 10 中工作

标签 c wpf sqlite

有一个经典的应用,其中使用了微软的Entity Framework Core.Sqlite,试图通过Windows 10部署发布一个应用,抛出异常:DllNotFoundException: Unable to load DLL "e_sqlite3": the specified module could not be found . (HRESULT 异常:0x8007007E)

尝试将 e_sqlite3 库添加到“Windows 应用程序打包项目”,但最终出现异常:SQLite 错误 14:首先使用 EF Core 代码“无法打开数据库文件”

我尝试了在 Internet 上找到的不同解决方案,但没有一个不适合我。

开发环境: Windows 10、Visual Studio 2017、Microsoft.EntityFrameworkCore.Sqlite 2.2.1.0 和 Microsoft.Data.Sqlite 2.2.1.0

最佳答案

这是我解决这两个问题的方法。

第一个问题是原生的 e_sqlite3.dll 文件没有被复制到 Package 项目的输出中。 Package 项目在 Microsoft.DesktopBridge.targets 中具有 MSBuild 逻辑,该逻辑正在调用其引用的每个项目(例如 WPF 项目)的 GetCopyToOutputDirectoryItems 目标。由于 e_sqlite3.dll 文件通过 NuGet 包包含在引用的项目中,因此包含它们的方式不会导致它们被 GetCopyToOutputDirectoryItems 目标拾取。我通过将以下代码添加到我的 WPF 项目来解决这个问题:

  <Target Name="IncludeNativeBinariesAsOutput" BeforeTargets="GetCopyToOutputDirectoryItems">
    <ItemGroup>
      <Content Include="$(OutputPath)\x64\e_sqlite3.dll">
        <Link>x64\e_sqlite3.dll</Link>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
      <Content Include="$(OutputPath)\x86\e_sqlite3.dll">
        <Link>x86\e_sqlite3.dll</Link>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
    </ItemGroup>

    <AssignTargetPath Files="@(Content)" RootFolder="$(MSBuildProjectDirectory)">
      <Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath" />
    </AssignTargetPath>
  </Target>

下一个问题是在必要的 native 文件位于所需位置后出现“无法打开数据库文件”错误。我认为这是因为它试图在 Windows 包项目不支持的位置创建项目。我通过设置一个特殊值来处理这个问题,SqliteConnection 会寻找该值来构建数据库文件的路径。在执行任何数据库操作之前,我只是将这一行添加到我的 App 构造函数类中。

AppDomain.CurrentDomain.SetData("DataDirectory", ApplicationData.Current.LocalFolder.Path);

关于c - 如何使 SqLite 在 Windows 10 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54388435/

相关文章:

Android sqlite 如果行存在则更新否则插入

c - 段错误 :I can't understand why

c# - 绑定(bind)组合框到字典,下拉列表显示键和值

sql - 如何对具有 NULL 值的字段进行分组?

wpf - 如何在wpf中根据条件检查隐藏字段?

WPF:折叠GridSplitter?

SQLite3 使用 LEFT JOIN 和 UNION 模拟 RIGHT OUTER JOIN

android - JNI XOR 加密 Eclipse 构建错误

c - 如何将 char ** 转换为 c 中的 char *[]?

c - 命名管道只能读不能写