.net - тренировки - смешанные единоборства спб




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

Ранее библиотеки .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 ошибку Unable to load DLL 'SQLite.Interop.DLL ?


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

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


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

Уловка - найдите слово «расслоение» в ссылках на скачивание

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

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

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

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

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

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


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

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





mixed-mode