发行时如何使SqLite在Windows 10中工作

时间:2019-01-27 13:07:13

标签: c wpf sqlite

有一个使用Microsoft的经典应用程序。实体框架Core.Sqlite,尝试通过Windows 10部署发布应用程序并引发异常:DllNotFoundException:无法加载DLL“ e_sqlite3”:找不到指定的模块。 (来自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

1 个答案:

答案 0 :(得分:0)

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

第一个问题是本机e_sqlite3.dll文件未复制到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>

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

AppDomain.CurrentDomain.SetData("DataDirectory", ApplicationData.Current.LocalFolder.Path);
相关问题