【发布时间】:2015-08-30 06:47:22
【问题描述】:
我们的一些用户遇到了在运行时加载的 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 的副本引起的。这安装在所有新的戴尔机器上,在这种机器上安装我们的软件的用户都会遇到这个问题。此戴尔软件还使用 System.Data.SQLite.dll。
正确版本的 sqlite.interop.dll 与我们的可执行文件位于同一目录中,我对 dll 加载的所有了解都表明应该优先加载它。
虽然我们尚未能够在本地重现该问题,但似乎错误版本的 interop.dll 不在路径上。此外,戴尔备份实用程序在启动时自动运行。有谁知道这可能与 dll 加载请求挂钩并提供错误文件的任何可能机制?
目前的思路是我们可以构建自己的 System.Data.SQLite.dll 并将互操作加载代码更改为特定命名的版本(例如 sqlite.interop.1.0.89.dll)。不是一个很好的解决方案,但是..
【问题讨论】:
-
难道不是——因为戴尔程序已经在运行——你对 DLL 的请求已经被已经驻留的那个满足了(除非你特别指定了一个版本)?如果您停止戴尔程序(和/或禁用它并重新启动),一切正常吗?
-
我没有认为这些类型的并行问题不再存在(W7/8),但似乎正在发生类似的事情。我已要求用户以安全模式启动并报告问题是否消失 - 仅作为诊断工具。
-
作为后续 - 当然在简单的测试案例中,有另一个应用程序已经加载并且当前正在使用之前版本的 sqlite.interop.dll,这不会影响我们真正的应用程序的哪个版本负载(我已经测试过了)。所以还有更多的事情发生..
-
也许为时已晚,但请看this 问题。当 SQLite.Interop.dll 注册为 shell 扩展(在 Windows 资源管理器中)时,它将被加载到您的
AppDomain。答案中描述了一种解决方法(使用 app.config)。 -
这正是我遇到的问题,可以用my answer“修复”前面的问题。问题程序也是戴尔备份和恢复。