Новые смешанные сборки 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
?
Ответы
Ответ 1
Я нашел решение. Проблема связана с известной проблемой с SQLite.Interop.dll.
Это обходной путь от того, что сработало для меня.
Использование Dependency Walker из http://dependencywalker.com/, чтобы посмотреть в SQLite.Interop.dll(x86 и x64) показывает, что это зависит от MSVCR100.dll.
Старая версия 1.0.66.0 System.Data.SQLite.dll не имеет эта зависимость. С текущим строить, нам пришлось бы перераспределять что MSVCR100.dll также или запускает установщик из Microsoft.
Решение: От: Отсутствует msvcr100.dll
Использовать статическую привязку. в Проект SQLite.Interop Visual Studio. Перейдите к этому параметру Свойства: Проект → Свойства → Свойства конфигурации → C/С++ → Генерация кода → Runtime Library и измените значение на Multi-threaded (/MT). (The текущий исходный код (1.0.71.0) Многопоточная DLL (/MD), которая вызывает dll полагаться на MSVCR100.dll и DLLImport (и LoadLibary()) для если пользователи не имеют этого).
Я считаю, что статическая привязка должна быть изменено так, что это значение по умолчанию для SQLite.Interop.dll.
Ответ 2
Страница downloads теперь содержит "смешанный режим" для всех вариантов System.Data.SQLite, которые работают так же, как и более ранние версии SQLite, т.е. нет требования также включить SQLite.Interop.dll в ваш проект.
Трюк - найдите слово "расслоение" в ссылках на скачивание
например. SQLite-netFx35-Setup- расслоением -x86-2008-1.0.76.0.exe
Вы также увидите, что текст описания для этих ссылок начинается с "Этот пакет установки содержит сборку смешанного режима" .
Меня сожгли, потому что я не понимал, что это действительно означает "загрузить этот, если вы хотите, чтобы он работал так, как он всегда делал до" .
Не имея представления о том, что подразумевалось при сборке в смешанном режиме, другие ссылки выглядели как лучший вариант, потому что они утверждают: "Этот установочный пакет установит все необходимые компоненты времени выполнения и зависимости".
Также обратите внимание, что единственный способ узнать, получил ли вы "неправильный", размер файла. DLL имеют точно такое же имя и точно такой же номер версии. Версия смешанного режима намного больше - около 700 тыс.. Другой - около 160K.
Какой беспорядок...
Ответ 3
У меня была та же проблема, в плагине для другого приложения. В моем случае я решил это, изменив переменную окружения 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
.
Ответ 4
На 64-битных машинах целевое приложение .NET, не предназначенное для AnyCPU, не может загружать 32-разрядные DLL файлы. Вероятно, вам нужно будет установить целевую платформу вашего приложения .NET на x86, чтобы заставить ее работать как на 64-битной, так и на 32-разрядной машинах.
Изменить: под капотом причина, по которой вы не можете загрузить DLL Interop, вероятно, из-за BadImageFormatException
из-за несогласованности битов с родным DLL файлом SQLite.