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