我们的一些用户遇到了在运行时加载的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).不是一个很好的解决方案,但..
我的C#/ SQLite工作正常,直到我决定更新SQLite DLL(从1.0.82.0到1.0.84.0).现在我遇到了这个崩溃:
无法在DLL"SQLite.Interop.dll"中找到名为"sqlite3_changes_interop"的入口点
A first chance exception of type 'System.EntryPointNotFoundException' occurred in System.Data.SQLite.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>SparkleShare.vshost.exe</AppDomain><Exception><ExceptionType>System.EntryPointNotFoundException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Unable to find an entry point named 'sqlite3_changes_interop' in DLL 'SQLite.Interop.dll'.</Message><StackTrace> at System.Data.SQLite.UnsafeNativeMethods.sqlite3_changes_interop(IntPtr db)
at System.Data.SQLite.SQLite3.get_Changes()
at System.Data.SQLite.SQLiteStatement.TryGetChanges(Int32&amp; changes)
at System.Data.SQLite.SQLiteDataReader.NextResult()
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)
代码没有改变,所以我不认为这是一个代码问题(无论如何,这是它发生的行).
我下载的新版本有什么问题吗?我在http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wikisqlite-netFx40-static-binary-Win32-2010-1.0.84.0.zip的Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0)段落中下载了
编辑:我恢复到以前的DLL,但问题仍然发生,可能是因为Visual C#在某处无法清理某些缓存.