Периодически я получаю следующее исключение:
Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Я использую 1.0.82.0. версия, установив ее с помощью nuget в VS2010, ОС Win7 64.
Как только исключение начинает появляться, оно появляется постоянно - при отладке, выпуске и запуске приложения внутри или вне VS.
Единственный способ остановить это - выход из системы и вход в систему. Исключение не выдается и dll загружается. Это может работать в течение нескольких дней, но затем оно может снова сломаться.
Кто-нибудь видел что-то подобное и есть ли решение для этого?
Ответы:
Я знаю, что опоздал на вечеринку, но у меня возникла эта проблема сразу после того, как я сегодня снял последнюю версию x86 / x64 (версия 1.0.88.0). Мой локальный IIS в VS2012 работает по умолчанию с 32-битной версией, и нет простого способа перейти на x64. Мой рабочий сервер работает на 64-битной.
В любом случае я установил пакет NuGet в проект DLL и получил эту ошибку. Что я должен был сделать, чтобы это работало, я должен был установить это на главный сайт проект . Даже если это не касается классов SQLite.
Я предполагаю, что SQLite использует сборку ввода, чтобы определить, какую версию Interop загрузить.
источник
У меня была эта проблема, потому что у dll, которую я использовал, была Sqlite как зависимость (настроенная в NuGet только с базовым пакетом Sqlite.). Проект компилирует и копирует все Sqlite dll-ы, кроме «SQLite.Interop.dll» (как папки x86, так и x64).
Решение было очень простым: просто добавьте пакет Sqlite.Core в качестве зависимости (с NuGet) в проект, который вы создаете / выполняете, и dll-ы будут скопированы.
источник
У меня была такая же проблема при использовании SQLite в проекте WPF, целью которого была платформа
Any CPU
. Я исправил это, выполнив следующие шаги:prefer 32-bit
опцию.В качестве альтернативы, вы можете просто установить цель платформы на
x86
илиx64
. Я думаю, что эта проблема вызванаSystem.Data.SQLite
библиотека использует целевой объект платформы для определения местоположения файла «SQLite.Interop.dll».ОБНОВИТЬ:
Если конструктор проекта не может быть достигнут, просто откройте
*.csproj
файл project ( ) из текстового редактора и добавьте значение<Prefer32Bit>false</Prefer32Bit>
в<PropertyGroup>...</PropertyGroup>
тег.Пример кода
источник
.csproj
Файл уже был установлен в файлfalse
, но все еще имел ошибку.Вот как я это исправил в своем проекте.
Это работало, и когда коллега представил свои изменения, я получил исключение «Невозможно загрузить DLL« SQLite.Interop.dll »».
В отличие от файла .csproj проекта, это было в НЕ РАБОЧЕЙ версии:
И вот что было в РАБОЧЕЙ версии:
Вернувшись назад, я не получил исключение. Файлы DLL были выгружены в соответствующие папки Debug \ x64 (и т. Д.).
источник
Таким образом, после добавления NuGet развертывание не копирует Interops. Вы можете добавить это в свой файл csproj, и это должно исправить это поведение:
Если вы посмотрите исходный код NuGet для SQLite, вы увидите, что именно они делают. Это позволило мне развернуть работу с ASP.Net Core.
источник
Когда вы попадете в это состояние, попробуйте выполнить Rebuild-All. Если это решит проблему, у вас может быть та же проблема, что и у меня.
Немного предыстории (мое понимание) :
SQLite имеет 1 управляемую сборку (System.Data.SQLite.dll) и несколько сборок, специфичных для платформы (SQLite.Interop.dll). При установке SQLite с Nuget, Nuget добавит специфичные для платформы сборки в ваш проект (в нескольких папках: \ x86, \ x64) и сконфигурирует эти библиотеки как «Копировать всегда».
При загрузке управляемая сборка будет искать специфичные для платформы сборки в папках \ x86 и \ x64. Вы можете увидеть больше об этом здесь . Исключением является то, что эта управляемая сборка пытается найти соответствующие (SQLite.Interop.dll) внутри этих папок (и не удается).
Мой сценарий :
У меня есть 2 проекта в моем решении; приложение WPF и библиотека классов. Приложение WPF ссылается на библиотеку классов, а библиотека классов ссылается на SQLite (устанавливается через Nuget).
Для меня проблема заключалась в том, что, когда я изменяю только приложение WPF, VS пытается выполнить частичное восстановление (понимая, что зависимая DLL не изменилась). Где-то в этом процессе VS очищает содержимое папок \ x86 и \ x64 (удаляя SQLite.Interop.dll). Когда я делаю полную Rebuild-All, VS копирует папки и их содержимое правильно.
Мое решение :
Чтобы это исправить, я добавил процесс пост-сборки с использованием xcopy, чтобы принудительно скопировать папки \ x86 и \ x64 из библиотеки классов в мой каталог \ bin проекта WPF.
В качестве альтернативы, вы можете сделать более интересные вещи с помощью конфигурационных / выходных каталогов сборки.
источник
У меня была та же проблема с Visual Studio Express 2013. Я пробовал несколько решений, упомянутых здесь и в других местах, но безрезультатно. Я надеюсь, что это исправление помогает другим.
Я исправил это с помощью
DeploymentItem
атрибута в моем тестовом классе, который тестирует службу на основе SQLite.Пример:
Это приводит к необходимости
SQLite.Interop.dll
скопировать вx86
каталог в соответствующей папке «TestResults».Все зелено. Все хорошо.
источник
Обновление NuGet
Tools -> Extension and updates
и переустановка SQLite.Core с помощью командыPM> Update-Package -reinstall System.Data.SQLite.Core
исправило это для меня.источник
У меня была похожая проблема в решении нескольких проектов. SQLite.Interop.dll был необходим для одного из плагинов, распространяемых вместе с программным обеспечением, использующим ClickOnce.
Что касается отладки в visual studio, то все работало нормально, но в развернутой версии отсутствовали папки x86 / и x64 /, содержащие эту DLL.
Чтобы заставить его работать после развертывания с использованием ClickOnce, нужно было создать в стартовом проекте решения (также опубликованного) эти две подпапки, скопировать в них библиотеки DLL и установить их как Content Copy Always.
Таким образом, инструмент публикации ClickOnce автоматически включает эти файлы и папки в манифест и развертывает программное обеспечение вместе с ними.
источник
Здесь действительно много ответов, но у меня все просто и понятно с отсутствием GAC-игры .
Проблема заключалась в том, что
SQLite.Interop.dll
для доступа к нашей базе данных исполняемому файлу требуется копия права (x86 или x64).В основном у архитектур есть слои, а в моем случае уровень данных имеет необходимую DLL для подключения SQLite.
Поэтому я просто вставил скрипт посткомпоновки в решение Data Layer, и все заработало нормально.
TL; DR;
Установите для всех проектов вашего решения
x86
илиx64
в опциях сборки.Добавить следующее
Post-Build-Script
к проекту сSQLite nuget Package
:xcopy "$(TargetDir)x64" "$(SolutionDir)bin\Debug\" /y
Конечно, вы должны изменить сценарий для
Release Build
иx86
сборок.STL; DR;
Поместите
SQLite.Interop.dll
рядом с*.exe
файлом.источник
Установка по умолчанию SQLite-версии с несколькими архитектурами (x86, x64) от NuGet демонстрирует поведение, которое вы описали. Если вы хотите загрузить правильную версию для фактической архитектуры, которую среда выполнения .NET выбрала для запуска приложения на вашем компьютере, то вы можете дать загрузчику DLL подсказку о том, где найти правильную библиотеку, следующим образом:
Добавьте объявление для вызова функции kernel32.dll в SetDLLDirectory () перед вашей Program.Main ():
Затем используйте свой собственный метод для определения правильного подкаталога, чтобы найти версию SQLite.Interop.dll для конкретной архитектуры. Я использую следующий код:
источник
даже если это старый пост, я хотел бы поделиться решением, которое я нашел здесь: http://system.data.sqlite.org/index.html/info/54e52d4c6f
Если вы не хотите читать все проблемы, решение состоит в том, чтобы скопировать файл "msvcr100.dll" (который находится в каталоге Windows \ System32) по тому же пути, что и SQLite.Interop.dll.
Я бы посоветовал прочитать проблему, чтобы понять причину и включить файл в ваши настройки, но установить его только в случае возникновения ошибки. Я сделал его необязательным компонентом, который можно выбрать в настройках.
HTH, Форментц
источник
Как говорится в вики SQLite , ваше приложение должно быть:
Так что нужно соблюдать правила. Найдите dll, которая соответствует вашей целевой платформе, и поместите ее в нужное место, описанное на картинке. Dlls можно найти в YourSolution / packages / System.Data.SQLite.Core.% Version% /.
У меня были проблемы с развертыванием приложения, поэтому я просто добавил в свой проект правильный файл SQLite.Interop.dll, добавил папку x86 в AppplicationFolder в проекте установки и добавил ссылки на файлы в dll.
источник
Вы также можете получить эту ошибку, если вы пытаетесь запустить 32-битную DLL в 64-битном проекте.
Я получил это, когда поместил один и тот же файл (SQLite.Interop.dll в 32-разрядной версии) в папку x86 и x64.
источник
Если вы загрузили правильный двоичный файл для,
SQLite
скопируйте егоSQLite.Interop.dll
в папку Release или Debug в соответствии с опцией сборки вашего проекта.источник
Я не знаю, почему это еще не было включено, но я должен был провести исследование и выяснить это для себя, так что, надеюсь, кто-то найдет этот ответ и спасет проблему. Это было для приложения WPF. Он отлично работал на моем устройстве Dev, но не работал на компьютере, где я его копировал, и получил
Unable to load DLL 'SQLite.Interop.dll'
ошибку. Я перенес все связанные с ним каталоги и файлы прямо из папки «Debug» на этот другой компьютер, когда у меня возникла та же ошибка, что и у OP при запуске. Моя папка «bin», в которой находились мои библиотеки DLL, была скопирована в «Debug \ bin», и все они были включены вместе с файлами приложения, когда я выполняла копирование на другой компьютер по этому пути, поэтому в ней не было пропущено ни одного файла.То, что я видел, говорилось в других ответах, которые не были применимы:
Я обнаружил следующее : https://system.data.sqlite.org/index.html/doc/trunk/www/faq.wiki#q20 :
Акцент мой на этой жирной части внутри абзаца. Целевой компьютер был свежим и не загружал никаких программ, кроме .NET 4.0. После того, как я установил C ++, он смог выполнить команды для SQLite. Это должно было быть одним из первых часто задаваемых вопросов и частью предварительных требований, но он был похоронен в # 11. Мой компьютер уже был загружен, потому что он поставлялся с Visual Studio, поэтому он работал там.
Загрузить:
Распространяемый Visual C ++ для Visual Studio 2015:
https://www.microsoft.com/en-us/download/details.aspx?id=48145.
Обновление 3 (накопительное обновление):
https://www.microsoft.com/en-us/download/details.aspx?id=53587
источник
Я начал использовать Costura.Fody для упаковки (.net) сборок, а также встраивания и предварительной загрузки собственных dll. Это также помогает позже, с распространением, так как вы можете отправить один файл.
Установите Костура Фоди из Nuget.
В вашем проекте C # создайте папку с именем costrua32. Там добавьте любые родные dll, которые вы загружаете на C #.
После того, как вы добавили их в эту папку. Нажмите на окно свойств и измените действие сборки на «Встроенный ресурс».
Наконец, вам нужно изменить файл XML с именем FodyWeavers.xml следующим образом. Здесь я указываю загрузить SQL DLL сначала. (обратите внимание, что вы бросаете .dll)
Преимущество этого состоит в том, что вам не нужно записывать какие-либо события до или после сборки, а конечный продукт полностью инкапсулируется в один больший файл.
источник
Также добавил dll в тестовый проект (через Nuget Manager) и исправил его.
источник
У меня была эта проблема, потому что распространяемый Visual C ++ 2010 не установлен на моем ПК. Если вы еще не установили распространяемый Visual C ++ 2010 Загрузите и установите это (проверьте x86 или 64 dll).
источник
У меня та же проблема. Однако, наконец, я могу это исправить. В настоящее время я использую Visual Studio 2013 Community Edition. Я просто использую Add-> Existing Item ... и просматриваю, где находятся файлы SQLite.Data.SQLite (мой случай 'C: \ Program Files (x86) \ System.Data.SQLite \ 2013 \ bin'). Пожалуйста, не забудьте изменить тип того, что вы будете включать в файлы сборки (* .dll; * .pdb) . Выберите « SQLite.Interop.dll » в этой папке. С этого момента я могу продолжить без каких-либо проблем. Удачи всем вам. ^ _ ^ PS Я создаю приложение веб-формы. Я еще не пробовал в форме окна приложения или других.
источник
Попробуйте установить целевую платформу на x86 или x64 (а не на любой ЦП) перед сборкой: Project-> Properties-> Build-> Platform target в Visual Studio.
источник
Скопируйте SQLite.Interop.dll в каталог проекта.
источник
Я долго боролся с этим и иногда обнаруживал, что настройки теста неверны. Смотрите это изображение:
Я просто снимаю флажок с настройки теста, и проблема исчезает. В противном случае возникнет исключение. Надеюсь, это кому-нибудь поможет. Не уверен, что это коренная причина.
источник
Скопируйте файлы «SQLite.Interop.dll» для x86 и x64 в папку отладки. эти файлы должны быть скопированы в папки «x86» и «x64» в папке отладки.
источник
Мое приложение является веб-приложением (ASP.NET MVC), и мне пришлось изменить пул приложений для запуска
LocalSystem
вместо негоApplicationPoolIdentity
. Сделать это:LocalSystem
Я понятия не имею, почему это решает проблему.
источник
Я не знаю, хороший ли это ответ, но я смог решить эту проблему, запустив свое приложение под доменом приложения с идентификатором «Локальная система».
источник
Я работаю над простым консольным приложением, чтобы добавить некоторые тестовые данные в базу данных SQLite, и получаю эту ошибку. Конфигурация для проекта «Любой процессор». Я исправил это, скопировав SQLite.Interop.dll в папку bin \ debug. Лучше было бы использовать метод @Wil, но как указать это для конфигурации «Любой процессор»?
источник
Может ли быть спор за сборку? Проверьте, есть ли другое приложение с блокировкой файла в DLL.
Если это причина, должно быть легко использовать такой инструмент, как Sysinternal Process Explorer, чтобы обнаружить нарушающую программу.
HTH, глина
источник
Для справки для тех, кто смотрит на этот вопрос:
Если вы используете пакет nuget, он устанавливает правило сборки, которое выполняет копирование за вас. (см. System.Data.SQLite.Core.1.0.94.0 \ build - или любую версию Core, которую вы устанавливаете).
Установщик nuget автоматически добавляет правило в файл проекта.
Это все еще не решает проблему тестового примера, хотя. Подход DeploymentItem ( https://stackoverflow.com/a/24411049/89584 ) - единственное, что, похоже, работает там.
источник
Я столкнулся с этой проблемой в решении с веб-проектом WebAPI / MVC5 и проектом Feature Test, в котором использовался один и тот же проект доступа к данным (или «Core»). Я, как и многие другие здесь, использую копию, загруженную через NuGet в Visual Studio 2013.
То, что я сделал, в Visual Studio добавило папку с решениями для x86 и x64 в Feature Test и веб-проекты. Затем я сделал
Right Click | Add Existing Item...
и добавил соответствующую библиотеку SQLite.interop.dll..\SolutionFolder\packages\System.Data.SQLite.Core.1.0.94.0\build\net451\[appropriate architecture]
для каждой из этих папок. Затем я сделалRight Click | Properties
, и наборCopy to Output Directory
вAlways Copy
. В следующий раз, когда мне нужно было выполнить свои функциональные тесты, тесты прошли успешно.источник