Mat*_*att 22 .net c# sqlite dll
我们的一些用户遇到了在运行时加载的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).不是一个很好的解决方案,但..
jco*_*cox 12
我们的应用程序有同样的问题.正如您所提到的,问题是Dell Backup and Recovery安装了一个shell扩展,它使用了几个流行dll的旧版本.他们使用任何启动文件对话框并使用这些库的应用程序,因为shell扩展将其dll加载到AppDomain中.到目前为止,我们唯一的解决方案是告诉用户卸载Dell Backup and Recovery.
如果你强制你的应用程序加载正确的库作为dymanoid提到,那么你的应用程序将在显示文件对话框时崩溃(因为shell扩展将崩溃).如果您不这样做,那么当您的应用程序尝试从其数据库中读取时,它将崩溃.
有趣的是,戴尔备份和恢复是一个屡次犯罪者; 它也以同样的方式打破了QT5.该建议的解决方案从QT家伙是编译以不同的名称与-qtnamespace [名]选项你的Qt库.我们或许可以使用system.data.sqlite来安装类似的东西,但是我们必须编译自己的版本.
微软意识到了这个问题,但拒绝修复它.
我希望戴尔家伙像这样实现他们的shell扩展.
Portroit Pro,SONAR和AutoDesk解决此问题的方法还包括卸载Dell Backup and Recovery.
问题的典型堆栈跟踪在我们的应用程序中看起来如下:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Data.SQLite.UnsafeNativeMethods.sqlite3_open_interop(Byte[] utf8Filename, Int32 flags, IntPtr& db)
at System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, Int32 maxPoolSize, Boolean usePool)
at System.Data.SQLite.SQLiteConnection.Open()
at STCommonShellIntegration.DataShellManagement.CreateNewConnection(SQLiteConnection& newConnection)
at STCommonShellIntegration.DataShellManagement.InitConfiguration(Dictionary`2 targetSettings)
at DBROverlayIcon.DBRBackupOverlayIcon.initComponent()
Run Code Online (Sandbox Code Playgroud)
所以在回答Track的评论时,如果你想检测这个特殊问题并给用户一些特别的通知,你可以这样做:
AppDomain.CurrentDomain.UnhandledException += UEHandler;
//...
static void UEHandler(object sender, UnhandledExceptionEventArgs e){
var ex = e.ExceptionObject as Exception;
if( ex.ToString().Contains( "DBROverlayIcon" ){
//show some dialog here telling users to uninstall DBaR
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2093 次 |
| 最近记录: |