【问题标题】:SQLite with "any cpu" compile option [ crash on 64 bit machine when unchecked "prefer 32 bit" option ]带有“任何 cpu”编译选项的 SQLite [未选中“首选 32 位”选项时在 64 位机器上崩溃]
【发布时间】:2013-07-24 12:27:26
【问题描述】:

我只是按照

的说明进行操作

SQLite-on-Visual-Studio-with-NuGet-and-Easy-Instructions

我可以使用

编译示例 C# 应用程序

“任何CPU”

选项。

但是当我运行应用程序时,如果我选择

“首选 32 位”

选项,我的应用程序崩溃:

"无法加载 DLL "SQLite.Interop.dll"

如果我取消选中“首选 32 位”选项,它在我的 64 位机器上可以正常工作。

为什么会发生这种情况?有什么修复它的建议吗?

PS:我使用 64 位 Windows 8。我为 SQLite 提供 [x86] 和 [x64] 文件夹。

PS 1: 错误:

System.TypeInitializationException:“System.Data.SQLite.SQLiteFactory”的类型初始化程序引发了异常。 ---> System.DllNotFoundException:无法加载 DLL 'SQLite.Interop.dll': 指定的模块无法找到。 (来自 HRESULT 的异常:0x8007007E) 在 System.Data.SQLite.UnsafeNativeMethods.sqlite3_config_none(SQLiteConfigOpsEnum 操作) 在 System.Data.SQLite.SQLite3.StaticIsInitialized() 在 System.Data.SQLite.SQLiteLog.Initialize() 在 System.Data.SQLite.SQLiteFactory..cctor() --- 内部异常堆栈跟踪结束 --- 在 System.Data.SQLite.SQLiteFactory..ctor()

PS 3:

我注意到一件有趣的事情。虽然在视觉工作室它会崩溃, 当我运行我的程序 exe 时,只需单击它,它就可以工作。

【问题讨论】:

  • 调试您的应用程序并找出返回的内容:System.IO.Directory.GetCurrentDirectory();这可能是您的 .dll 所在的位置。
  • 它在调试模式 F:\TestWorkSpace\SQLiteTest\bin\Debug 下提供了我的 bin 目录,并且有一个 x86 文件夹,其中包含 SQLite.Interop.dll。 SQLite 说它会查看 x86 文件夹
  • 当我调试时,虽然我选择了“prefer 32 bit”...它尝试在x64下加载。 "正在尝试加载本机 SQLite 库 "F:\TestWorkSpace\SQLiteTest\bin\Debug\x64\SQLite.Interop.dll"..."
  • 尝试将 32 位 SQLite.Interop.dll 放在 \bin\Debug\ 目录中。它必须看到你仍然在一台 64 位机器上,所以它会尝试运行 64 位机器,但因为它是 32 位进程而无法运行?
  • 在这种情况下它可以工作。但我想同时编译 x86 和 x64。如果是 x86,它应该看起来 x86 文件夹如果它是 x64 应该看起来 x64

标签: c# .net sqlite


【解决方案1】:

以管理员身份运行命令提示符。 cd 进入您的 x64 .dll 目录。然后输入:gacutil -i SQLite.Interop.dll。然后cd 到带有 x86 .dll 的目录。再次输入:gacutil -i SQLite.Interop.dll。现在它应该可以正常工作了。

这样做是将每个程序集安装到系统上的 GAC(全局程序集缓存)中。它根据编译方式(x86 或 x64)将它们放入正确的系统缓存目录中。这应该只用于调试目的。

GAC 32bit vs. 64bit

对于客户端计算机。分别为 x86 和 x64 进行部署。当然,请为每个输入正确版本的 .dll。

【讨论】:

  • 我不想将它们安装到 GAC。我想要没有安装配置的简单嵌入式数据库。所以我选择 SQLite
  • GAC 用于调试目的,我进行了适当的编辑。您想要为客户或您自己创建一个简单的数据库?
  • 为客户和我。所以使用 GAC 是个坏主意。我之前有很多问题。
  • 对于客户,您必须部署 2 个版本的软件,对吗? 64位和32位?对于调试 GAC 效果很好。对于客户端,您可以使用正确版本的 SQLite.Interop.dll 将软件部署到应用程序运行所在的同一目录中,或者您可以选择此处列出的选项之一:msdn.microsoft.com/en-us/library/7d83bc18(v=vs.80).aspx
  • 不只是一个部署。[任何 cpu] 如果安装在 32 位上将使用 x86,如果在 x64 上将使用 x64。没有其他配置。
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多