我们一些用户在运行时遇到了sqlite.interop.dll版本加载问题,这是一个真正的棘手问题。
背景: 一个AnyCPU的WPF应用程序,使用了SQlite .NET和sqlite.interop.dll 1.0.89版本进行部署。我们部署了x86和x64的dll,并使用了SQLite提供的延迟加载功能。 一直使用得很好,但最近我们开始从一些用户那里收到支持问题,其中大多数人通常购买了新的戴尔计算机。看起来有一个旧版本的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吗?
编辑 - 一些附加信息:
冲突是由Dell Backup and Recovery安装的sqlite.interop.dll版本1.0.80引起的。这个软件安装在所有新的戴尔机器上,安装我们的软件的用户都会遇到这个问题。这个Dell软件也使用System.Data.SQLite.dll。
正确的sqlite.interop.dll版本位于与我们的可执行文件相同的目录中,我所了解的关于dll加载的一切都表明这应该是首选加载的。
虽然我们尚未能够在本地重现此问题,但似乎错误的interop.dll版本不在路径上。此外,Dell备份实用程序会在启动时自动运行。有人知道可能通过什么机制来挂钩dll加载请求并提供错误的文件吗?
当前的想法是,我们可能会构建自己的System.Data.SQLite.dll,并将interop加载代码更改为具有特定名称的版本(例如sqlite.interop.1.0.89.dll)。这对于未来来说并不是一个好的解决方案,但是..
AppDomain
中。答案中描述了一种解决方法(使用app.config)。 - dymanoid