- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们的一些用户遇到了运行时加载的 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 的错误版本不在路径上。此外,戴尔备份实用程序会在启动时自动运行。有谁知道这可能挂接到 dll 加载请求并提供错误文件的任何可能机制?
目前的思路是我们可以构建自己的 System.Data.SQLite.dll 并将互操作加载代码更改为特定命名的版本(例如 sqlite.interop.1.0.89.dll)。这不是一个很好的解决方案,但是..
最佳答案
我们的应用程序有同样的问题。正如您所提到的,问题在于 Dell Backup and Recovery 安装了一个 shell 扩展,该扩展使用了多个流行 dll 的旧版本。他们对任何启动文件对话框并使用这些库的应用程序都玩得很烂,因为 shell 扩展将它们的 dll 加载到您的 AppDomain 中。到目前为止,我们唯一的解决方案是告诉用户卸载 Dell Backup and Recovery。
如果你force your app to load the correct library正如dymanoid提到的,那么当它显示文件对话框时你的应用程序会崩溃(因为shell扩展会崩溃)。如果您不这样做,那么您的应用会在尝试从其数据库中读取时崩溃。
有趣的是,Dell Backup and Recovery 是屡犯者;它还breaks QT5以同样的方式。 recommended solution来自 QT 人员的是使用 -qtnamespace [name] 选项以不同的名称编译您的 QT 库。我们也许可以使用 system.data.sqlite 来装配类似的东西,但是我们必须编译我们自己的版本。
微软是aware of the problem ,但拒绝修复它。
我希望 Dell 的人已经实现了他们的 shell 扩展 like this .
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()
所以在回答 Track 的评论时,如果你想检测这个特定问题并给用户一些特别通知,你可以这样做:
AppDomain.CurrentDomain.UnhandledException += UEHandler;
//...
[HandleProcessCorruptedStateExceptions] //access violation
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
}
}
关于c# - SQLite 的 DLL hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30833889/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!