Новые смешанные сборки 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.