Новые смешанные сборки SQLite

Ранее библиотеки.NET SQLite были доступны с http://sqlite.phxsoftware.com, но они были недавно приняты основной командой SQLite и переместили страницу загрузки System.Data.SQLite. Кажется, что новые пакеты больше не содержат смешанных сборок (одна сборка, содержащая sqlite3.dll и оболочку.NET).

Новый пакет поставляется с.NET DLL и SQLite.Interop.dll который на основе документации не требуется на рабочем столе, но мое приложение не может загрузить с Unable to load DLL 'SQLite.Interop.DLL': The specified module could not be found., Я попытался запустить приложение под IIS/IIS Express с установленным apppool 32-битным.

Я пытался скопировать SQLite.Interop.dll подать в bin папка, системная папка и временная папка ASP.NET, но все равно получают ту же ошибку.

Есть ли где-нибудь смешанные сборки для новых выпусков? Если нет, есть ли способ исправить Unable to load DLL 'SQLite.Interop.DLL ошибка?

4 ответа

Решение

Я нашел решение. Проблема была из-за известной проблемы с SQLite.Interop.dll.

Это обходной путь, который работал для меня.

Использование Dependency Walker с http://dependencywalker.com/ для просмотра SQLite.Interop.dll (x86 и x64) показывает, что это зависит от MSVCR100.dll.

Старая версия System.Data.SQLite.dll версии 1.0.66.0 не имеет этой зависимости. В текущей сборке нам придется распространять этот файл MSVCR100.dll также или запустить программу установки от Microsoft.

Решение: От: Отсутствует msvcr100.dll

Используйте статические ссылки. В проекте SQLite.Interop Visual Studio. Перейдите к этому параметру Свойства: Проект -> Свойства -> Свойства конфигурации -> C/C++ -> Генерация кода -> Библиотека времени выполнения и измените значение на Многопоточное (/MT). (Текущий исходный код (1.0.71.0) имеет многопоточную DLL (/MD), которая заставляет dll полагаться на MSVCR100.dll, а DLLImport (и LoadLibary()) завершается сбоем, когда у пользователя его нет).

Я считаю, что статические ссылки должны быть изменены, так что это по умолчанию для SQLite.Interop.dll.

Страница загрузок теперь содержит загрузки в "смешанном режиме" для всех вариантов System.Data.SQLite, которые работают так же, как и в более ранних версиях SQLite, то есть нет необходимости включать SQLite.Interop.dll в ваш проект.

Хитрость есть - ищите слово "связка" в ссылках на скачивание

например, sqlite-netFx35-setup- bundle -x86-2008-1.0.76.0.exe

Вы также увидите, что текст описания этих ссылок начинается с "Этот пакет установки содержит сборку в смешанном режиме".

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

Не имея представления о том, что подразумевается под сборкой в ​​смешанном режиме, другие ссылки казались лучшим вариантом - потому что они утверждают: "Этот установочный пакет установит все необходимые компоненты и зависимости времени выполнения".

Также обратите внимание, что единственный способ определить, ошибся ли вы, - по размеру файла. Библиотеки DLL имеют одинаковое имя и номер версии. Версия в смешанном режиме намного больше - около 700К. Другой около 160К.

Какой беспорядок...

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

// Make SQLite work... (loading dll from e.g. x64/SQLite.Interop.dll)
System.Environment.SetEnvironmentVariable("PreLoadSQLite_BaseDirectory", System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));

Sql.Data.SQLite...

Я не понимаю, почему это требуется, хотя, как я думал PreLoadSQLite_BaseDirectory (ну, соответствующая внутренняя переменная) будет по умолчанию к месту расположения System.Data.SQLite.dll файл.

На 64-разрядных компьютерах приложение.NET, нацеленное на AnyCPU, не может загружать 32-разрядные файлы DLL. Вероятно, вам потребуется установить целевую платформу приложения.NET на x86, чтобы она работала как на 64-разрядных, так и на 32-разрядных компьютерах.

Редактировать: под капотом причина, по которой вы не можете загрузить Interop DLL, возможно, из-за BadImageFormatException из-за несоответствия разрядности с собственным файлом DLL SQLite.

Другие вопросы по тегам