Некоторые из наших пользователей получают проблему с версией sqlite.interop.dll, загружаемой во время выполнения, и это настоящий головной скребок.
Фон: Приложение 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?
Изменить - дополнительная информация:
Столкновение вызвано копией sqlite.interop.dll версии 1.0.80, установленной с помощью Dell Backup and Recovery. Это устанавливается на всех новых компьютерах 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). Нехорошее решение идет вперед, но..