Новые смешанные сборки SQLite - PullRequest
26 голосов
/ 01 июня 2011

Ранее библиотеки .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 с 32-разрядным приложением apppool.

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

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

Ответы [ 4 ]

24 голосов
/ 03 ноября 2011

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

Хитрость в том, что ищите слово "bundle" в ссылках для скачивания

например. SQLite-netFx35-Setup- комплект -x86-2008-1.0.76.0.exe

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

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

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

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

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

18 голосов
/ 02 июня 2011

Я нашел решение. Проблема была из-за известной проблемы с 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 / C ++ -> Генерация кода -> Runtime Library и измените значение на Многопоточность (/ MT). (The текущий исходный код (1.0.71.0) имеет Многопоточная DLL (/ MD), которая вызывает DLL полагаться на MSVCR100.dll и DLLImport (и LoadLibary ()) для ошибка, если у пользователя его нет).

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

8 голосов
/ 24 октября 2012

У меня была такая же проблема, в плагине для другого приложения.В моем случае я решил эту проблему, изменив переменную окружения 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 голосов
/ 01 июня 2011

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

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

...