Некоторые из наших пользователей получают проблему с версией sqlite.interop.dll, загружаемой во время выполнения, и это настоящий головной скребок.DLL hell with SQLite
Фон: Приложение WPF, созданное для AnyCPU, развернутое с помощью SQlite .NET и sqlite.interop.dll версии 1.0.89. Мы развертываем dll x86 и x64 и используем загрузку задержки, включенную в SQLite. Это было хорошо до недавнего времени, когда мы начали получать несколько проблем со стороны пользователей, которые, как правило, недавно приобрели новые компьютеры Dell. Похоже, что есть более старая версия sqlite.interop.dll (v.1.0.80), которая, , как-то, загружается по сравнению с той, которую мы отправляем. Ошибка, которую мы получаем, является отсутствующей точкой входа, «sqlite3_changes_interop».
То, что мы пытались:
Изменение установки просто скопировать соответствующий DLL (x86/64) в том же каталоге, что и исполняемый во время инсталляции (то есть не отдельные папки x86/x64). Это означает, что мы больше не используем загрузку задержки, так как правильная dll доступна в исполняемом каталоге (хотя мы явно не отключили механизм загрузки задержки в sqlite.net). Это не исправить проблему.
При загрузке приложения явная загрузка sqlite.interop.dll. Опять же, это не похоже на проблему.
Похоже, что упорядочение местоположений загрузки dll в последние годы несколько менялось, и у меня может не быть хорошей ручкой. Я всегда предполагал, что dll в исполняемом каталоге получит первое предпочтение, и что DLL, которая была явно загружена, предотвратит перезагрузку одной и той же DLL во время жизни приложения, поэтому в течение жизни я не могу понять, что здесь происходит ,
Может ли кто-нибудь пролить свет на то, что может происходить здесь? Проблема еще больше усугубляется тем, что я просто не могу воспроизвести проблему локально - например, поместив неправильную версию dll в мой системный путь и т. д. Что заставляет меня думать, что, возможно, GAC может вступить в игру?
Действительно застрял на этом, поэтому любая помощь будет отличной.
Также - в качестве конечного курорта - я мог бы подумать о возврате к той же версии 1.0.80, чтобы мы не получили эту проблему. Кто-нибудь знает, где мы могли бы использовать более старые версии sqlite.net и sqlite.interop.dll?
Edit - дополнительная информация:
столкновение вызвано копией sqlite.interop.dll версии 1.0.80, который установлен с Dell резервного копирования и восстановления. Это устанавливается на всех новых компьютерах Dell, и пользователи, которые устанавливают наше программное обеспечение на такой машине, все это испытывает. Это программное обеспечение Dell также использует System.Data.SQLite.dll.
Правильная версия sqlite.interop.dll находится в том же каталоге, что и наш исполняемый файл, и все, что я понимаю о загрузке dll, предполагает, что это должно быть загружено в предпочтении.
Хотя мы еще не смогли воспроизвести проблему локально, оказалось, что неверная версия interop.dll не на пути. Кроме того, утилита резервного копирования Dell запускается автоматически при запуске.Кто-нибудь знает о каком-либо возможном механизме, с помощью которого это может быть связано с загрузкой запросов DLL и обслуживанием неправильного файла?
Нынешняя линия мышления состоит в том, что мы можем создать собственную System.Data.SQLite.dll и изменить код загрузки interop на специально именованную версию (например, sqlite.interop.1.0.89.dll). Нехорошее решение идет вперед, но ...
Разве это не так, поскольку программа Dell уже запущена - ваши запросы на DLL удовлетворяются уже существующим (если вы конкретно не назвали версию)? Что делать, если вы остановите программу Dell (и/или отключите ее и перезагрузите)? – TripeHound
Я не думал, что эти побочные проблемы были вокруг (W7/8), но похоже, что что-то происходит. Я попросил пользователя загрузиться в безопасном режиме и сообщить о том, пропала ли проблема - как инструмент диагностики. – Matt
В качестве продолжения - конечно, в простом случае с другим загруженным приложением и в настоящее время использующим предыдущую версию sqlite.interop.dll, это не влияет на ту версию, которую загружает наше реальное приложение (я это проверил) , Итак, что-то еще происходит. – Matt