2014-11-05 4 views
11

Установлен System.Data.SQLite Core (x86/x64) from NuGet. Он был построен без предупреждений, но бросил System.DllNotFoundException относительно SQLite.Interop.dll. Я сфальсифицировал свои проекты, чтобы скопировать SQLite.Interop.dll из каталога каталога NuGet в выходной каталог, и теперь он запускается без исключения.System.Data.SQLite от NuGet, interop dll не скопирован в каталог вывода

Почему пакет NuGet не сконфигурировал мои проекты для размещения соответствующей DLL-оболочки в выходном каталоге? Похоже, он должен это сделать.

Я новичок в interop, и я унаследовал эту кодовую базу, которая ранее ссылалась на System.Data.SQLite.dll напрямую по пути. Я переключился на NuGet, чтобы избавиться от предупреждений о несоответствии между процессорной архитектурой проекта vs System.Data.SQLite. Я пытаюсь построить все проекты как AnyCPU.

ответ

4

Я думал, что это происходит, поскольку я копировал файлы из моей выходной папки в другое место, когда я их развернул. Я пропустил тот факт, что файлы взаимодействия были скопированы, но они скопированы в папки x64 и x86 в вашей выходной папке.

Если вы запустите msbuild в отладке проекта, вы можете найти ссылки на цель CopySQLiteInteropFiles, чтобы убедиться, что она запущена.

+0

Интересно, я вижу их там. Итак, он копирует их туда, где их невозможно найти во время выполнения? Интересно, будет ли он работать для конкретных машин. Я пробовал сборки x86 и x64, но получил ошибки. Может быть, проблема на моем конце, не уверен. – Vimes

+0

Они * * найдены во время выполнения. Если я удалю эти папки, я получаю ошибку загрузки. Если я этого не сделаю, это сработает. Я только открыл это, потому что я копировал файлы из выходного каталога в другое место для запуска, и я не копировал подкаталоги. – Richard

+3

Не для меня. Я получаю исключение DllNotFoundException во время выполнения. Все ваши проекты, созданные как AnyCPU? – Vimes

4

В моем случае SQL.Interop.dll никак не копировался Nuget, вручную помещал правильную версию dll в папку x86 и x64, решив проблему.

Если вы установили Sqlite от NuGet, вы можете найти SQL.Interop.dll в этой папке (для .NET 4.0)

PROJECT_FOLDER\packages\System.Data.SQLite.Core.1.0.*.*\build\net40

+0

Такая же проблема. Nuget не добавляет SQLite.Interop.dll в папку вывода. Пришлось разместить его там, используя событие после сборки. – Eternal21

2

В моем случае файл myProject.csproj не было System.Data.SQLite.Core.targets определено. Я добавил следующую строку и оба значения x64 и x86 версии SQLite.Interop.dll теперь скопированы для всех целей сборки.

<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')" /> 

Я не уверен, что произойдет, когда пакет NuGet для System.Data.SQLite.Core обновляется и, если пакет будет путь, должен быть изменен вручную.

5

В моем случае проблема заключалась в том, что я использовал SQLite внутри проекта библиотеки классов, который затем использовался другим проектом WPF (gui type).

Решена SQL.Interop.dll не получает скопированные в выходной каталог, с помощью следующей команды после сборки, внутри Свойства проекта -> Build Events:

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 
0

в моем случае с помощью NuGet для установки SQLite и все же мне нужно добавить вручную SQliteinterop.dll в качестве ресурса. Затем я строю muy proyect, и когда я публикую его, он отлично работает. (Работа с конфигурацией x86)

0

Ни один из вышеперечисленных ответов не работал для меня, возможно, потому, что я на VS2015, но это поразило меня как повод добавить мое собственное решение этой проблемы.

Моя конкретная ситуация такая же, как @ Eternal21. У меня есть пользовательский интерфейс WPF, который использует библиотеку клиентов, которая имеет SQLite, добавленную к ней через nuget. И, да, проблема заключалась в том, что Interop.dll не был скопирован в приложение запуска (т. Е. Пользовательский интерфейс WPF, который не имеет установленного SQLite).

Решение простого добавления SQLite в проект WPF с использованием nuget является быстрым и легким решением, если вы спешите.

Мое немного тяжелое решение использует XCOPY, но имеет преимущество в копировании каталогов x86 и x64, а также справляется с сборками Debug и Release. Его недостатком является то, что он содержит жестко запрограммированные названия проектов. Я могу видеть, как можно использовать макрос, чтобы избавиться от первого, но я не мог легко понять, как избавиться от второго, поэтому вам придется вручную его менять, если имя проекта изменилось (но это довольно редко).

Мое решение использовать эти команды XCOPY в пост-билд проекта запуска:

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 - Продолжает копирование, даже если ошибка (возможно, это не требуется).

/F - отображает полные пути копируемых файлов (может быть опущен для очистки сборки).

/S - Копирует подкаталоги (это был единственный способ получить его для создания папок/x86 и/x64).

/E - копирует каталоги и подкаталоги (возможно, дубликаты/S).

/Y - Подавляет запрос, если файл назначения уже существует.

Я установил это, чтобы работать только на успешной сборке, и это работает для меня. Надеюсь, это поможет кому-то.

2

С System.Data.SQLite.Core пакет NuGet версии 1.0.104, у меня была такая же проблема, как у @ Eternal21 и @Patrick. То есть проект A ссылается на ссылки SQLite и B проекта A, где SQlite.Interop.dll не скопирован в выходной каталог B.

Я нашел решение, которое решает проблему в проекте A, а не B, что является более надежным решением, поскольку оно исправляет эту проблему один раз для всех будущих проектов отсылая к А. .targets файл пакета NuGet содержит следующий раздел:

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

Этот раздел добавляет SQLite.Interop.dll в качестве эталона, который должен быть скопирован проецировать выход A и также вывод ссылочных проектов (например, B). Но свойство MSBuild ContentSQLiteInteropFiles по умолчанию не определено (я не знаю почему), отключив ссылку по первому условию. Чтобы включить его, я добавил следующую строку в PropertyGroup элемент проектов файла А в .csproj:

<ContentSQLiteInteropFiles>true</ContentSQLiteInteropFiles> 

Обратите внимание, что эта линия должна prececde на Import элемент для .targets файла пакета NuGet.

+0

Спасибо! Это исправило мою проблему. –

0

У меня есть проект DLL, который использует пакет SQLite от nuget, но тестовый проект для него всегда будет поднимать исключение, не найденное DLL.

Самое простое решение, которое я нашел, это добавить пакет SQLite nuget в тестовый проект.

Смежные вопросы