我正在开发一个使用 SQLite3 数据库并需要在 Windows 和 Linux 之间交叉兼容的 C# 项目。
Linux 服务器使用的是 3.2.8 版,我使用的是 Managed Sqlite Library DLL 1.0.66.0。
我已将 DLL 复制到服务器,当我运行 mono myexec.exe 时它显示以下错误
Unhandled Exception: System.EntryPointNotFoundException: sqlite3_open_v2 at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods:sqlite3_open_v2 (byte[],intptr&,int,intptr) at System.Data.SQLite.SQLite3.Open (System.String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) [0x00000] in :0 at System.Data.SQLite.SQLiteConnection.Open () [0x00000] in :0 at AudioManagement.DatabaseConnection..ctor () [0x00000] in :0 at LinuxAudioManager.Configure.startConfiguration () [0x00000] in :0 at LinuxAudioManager.Program.Main (System.String[] args) [0x00000] in :0
当它尝试创建数据库文件或打开连接时抛出此错误,我不确定是哪一个。
下面是我用来创建连接的代码
conn = new SQLiteConnection("Data Source=database.db");
conn.Open()
感谢您提供的任何帮助。
更新 我刚刚用单声道日志记录执行了我的程序,发现了一些相当奇怪的东西。加载 lib 文件似乎有问题。输出如下
Mono-INFO: DllImport attempting to load: 'libsqlite3.so.0'. Mono-INFO:
DllImport loading location: 'libsqlite3.so.0.so'. Mono-INFO: DllImport
error loading library: 'libsqlite3.so.0.so: cannot open shared object
file: No such file or directory'. Mono-INFO: DllImport loading
library: './libsqlite3.so.0.so'. Mono-INFO: DllImport error loading
library './libsqlite3.so.0.so: cannot open shared object file: No such
file or directory'. Mono-INFO: DllImport loading: 'libsqlite3.so.0'.
Mono-INFO: Searching for 'sqlite3_open_v2'. Mono-INFO: Probing
'sqlite3_open_v2'. Mono-INFO: Probing 'sqlite3_open_v2'. Mono-INFO:
Probing 'sqlite3_open_v2A'. Mono-INFO: Probing 'sqlite3_open_v2A'.
Mono-INFO: DllImport attempting to load: 'libsqlite3.so.0'. Mono-INFO:
DllImport loading location: 'libsqlite3.so.0.so'. Mono-INFO: DllImport
error loading library: 'libsqlite3.so.0.so: cannot open shared object
file: No such file or directory'. Mono-INFO: DllImport loading
library: './libsqlite3.so.0.so'. Mono-INFO: DllImport error loading
library './libsqlite3.so.0.so: cannot open shared object file: No such
file or directory'. Mono-INFO: DllImport loading: 'libsqlite3.so.0'.
Mono-INFO: Searching for 'sqlite3_open_v2'. Mono-INFO: Probing
'sqlite3_open_v2'. Mono-INFO: Probing 'sqlite3_open_v2'. Mono-INFO:
Probing 'sqlite3_open_v2A'. Mono-INFO: Probing 'sqlite3_open_v2A'.
文件 libsqlite3.so.0 确实存在,但我不明白为什么 mono 会尝试加载 libsqlite3.so.0.so.
更新 2 我认为第一个更新错误消息将我指向了错误的方向,因为我创建了一个符号链接(symbolic link)来匹配它找不到 lib 文件的位置,并且单声道不再说它无法加载某些东西。但是仍然显示原始的 EntryPointNotFoundException
更新 3 感谢@bryanmac,我更改了代码以使用 Mono.Data.Sqlite dll,它在 Linux 下的单声道下运行良好。但是,在 Windows 中使用此 DLL 现在不再有效。 VS2010 可以毫无问题地构建它,但是当我尝试执行它时,它会显示错误
Unable to load DLL 'sqlite3': The specified module could not be found
我已经从 sqlite 网站下载了一个 sqlite3.exe 二进制文件,并将可执行文件下载到我的程序的可执行文件中,但我的程序仍然在 Windows 上显示错误消息。
最佳答案
由于您的程序使用的 SQLite 客户端程序集的 .Net 实现与单声道附带的程序集不同,因此您的新程序集正在调用一个非托管函数,该函数在单声道附带的 sqlite C 库中不存在.
Mono 默认附带一个配置项,用于重定向请求 sqlite 和 sqlite3 时使用的共享库。这通常在 /etc/mono/config
这是我在我的机器上看到的:
$ grep -i sqlite /etc/mono/config
<dllmap dll="sqlite" target="libsqlite.so.0" os="!windows"/>
<dllmap dll="sqlite3" target="libsqlite3.so.0" os="!windows"/>
这在 http://www.mono-project.com/Config_DllMap 中有描述.
您可以创建一个配置文件来为您自己的程序覆盖为单声道定义的默认值。
<!-- myprogram.exe.config -->
<configuration>
<dllmap dll="sqlite3" target="./libsqlite3.so.0"/>
</configuration>
请注意 ./
,它强制运行时在与库的 exe 相同的文件夹中查找。
如果您决定使用不同于 mono 的 Mono.Data.Sqlite 版本,那么您可能仍然需要这样做。
关于c# - 在 Mono 上运行 Sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819083/