Как заставить SqLite работать в Windows 10 при публикации - PullRequest
0 голосов
/ 27 января 2019

Существует классическое приложение, в котором используется Microsoft. Entity Framework Core.Sqlite пытается опубликовать приложение через развертывание Windows 10 и выдает исключение: DllNotFoundException: Невозможно загрузить DLL «e_sqlite3»: указанный модуль не найден,(Исключение из HRESULT: 0x8007007E)

Попытка добавления библиотеки e_sqlite3 в «Проект упаковки приложений Windows», в конце с исключением: Ошибка SQLite 14: «невозможно открыть файл базы данных» с кодом EF Core первым

Я пробовал разные решения, найденные в Интернете, но ни одно из них мне не подошло.

Среда разработки: Windows 10, Visual Studio 2017, Microsoft.EntityFrameworkCore.Sqlite 2.2.1.0 и Microsoft.Data.Sqlite 2.2.1.0

1 Ответ

0 голосов
/ 10 марта 2019

Вот как я решил обе проблемы.

Первая проблема заключается в том, что собственные файлы e_sqlite3.dll не копируются в выходные данные проекта пакета.Проект Package имеет логику MSBuild в Microsoft.DesktopBridge.targets, которая вызывает цель GetCopyToOutputDirectoryItems для каждого из ссылочных проектов (например, проекта WPF).Поскольку файлы 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.Я справился с этим, установив специальное значение, которое SqliteConnection ищет для построения пути к файлу базы данных.Я просто добавил эту строку в свой класс конструктора приложения перед выполнением каких-либо операций с базой данных.

AppDomain.CurrentDomain.SetData("DataDirectory", ApplicationData.Current.LocalFolder.Path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...