在Mono上运行Sqlite

我正在开发使用SQLite3数据库的ac#项目,并且需要在Windows和Linux之间交叉兼容。

Linux服务器使用的是3.2.8版,我使用的是Managed Sqlite Library DLL 1.0.66.0。

我已经将DLL复制到服务器,当我运行mono myexec.exe时,它显示以下错误

未处理的异常:System.EntryPointNotFoundException:sqlite3_open_v2 at(wrapper managed-to-native)System.Data.SQLite.UnsafeNativeMethods:sqlite3_open_v2(byte [],intptr&,int,intptr)在System.Data.SQLite.SQLite3.Open(System。字符串strFilename,SQLiteOpenFlagsEnum标志,Int32 maxPoolSize,布尔usePool)[0x00000] in:0在System.Data.SQLite.SQLiteConnection.Open()[0x00000]在:0在AudioManagement.DatabaseConnection..ctor()[0x00000]在: 0在LinuxAudioManager.Configure.startConfiguration()[0x00000] in:0在LinuxAudioManager.Program.Main(System.String [] args)[0x00000] in:0

当它尝试创建数据库文件或打开连接时会引发此错误,我不确定它是哪一个。

下面是我用来创建连接的代码

conn = new SQLiteConnection("Data Source=database.db");
conn.Open()

感谢您的任何帮助,您可以提供。

更新我刚刚执行我的程序与单声道日志记录,发现了一些奇怪的东西。 它似乎有加载lib文件的问题。 输出如下

Mono-INFO:DllImport试图加载:'libsqlite3.so.0'。 单信息:

DllImport加载位置:'libsqlite3.so.0.so'。 Mono-INFO:DllImport

错误加载库:'libsqlite3.so.0.so:无法打开共享对象

文件:没有这样的文件或目录'。 Mono-INFO:DllImport加载

库:'./libsqlite3.so.0.so'。 Mono-INFO:DllImport错误加载

库'./libsqlite3.so.0.so:无法打开共享对象文件:没有这样的

文件或目录'。 单声道INFO:DllImport加载:'libsqlite3.so.0'。

单声道信息:搜索'sqlite3_open_v2'。 单声道信息:探测

'sqlite3_open_v2'。 Mono-INFO:探测'sqlite3_open_v2'。 单信息:

探测'sqlite3_open_v2A'。 Mono-INFO:探测'sqlite3_open_v2A'。

Mono-INFO:DllImport试图加载:'libsqlite3.so.0'。 单信息:

DllImport加载位置:'libsqlite3.so.0.so'。 Mono-INFO:DllImport

错误加载库:'libsqlite3.so.0.so:无法打开共享对象

文件:没有这样的文件或目录'。 Mono-INFO:DllImport加载

库:'./libsqlite3.so.0.so'。 Mono-INFO:DllImport错误加载

库'./libsqlite3.so.0.so:无法打开共享对象文件:没有这样的

文件或目录'。 单声道INFO:DllImport加载:'libsqlite3.so.0'。

单声道信息:搜索'sqlite3_open_v2'。 单声道信息:探测

'sqlite3_open_v2'。 Mono-INFO:探测'sqlite3_open_v2'。 单信息:

探测'sqlite3_open_v2A'。 Mono-INFO:探测'sqlite3_open_v2A'。

文件libsqlite3.so.0确实存在,但我看不出为什么mono会尝试加载libsqlite3.so.0.so。

更新2我认为第一次更新错误消息指向我在错误的方向,因为我创建了一个符号链接来匹配它无法找到lib文件和单声道不再说它无法加载的东西。 但是仍然显示原始的EntryPointNotFoundException

更新3感谢@ bryanmac我已经更改了代码,以使用Mono.Data.Sqlite dll,而不是在单声道下的Linux上正常工作。 但是,在Windows中使用此DLL现在不再有效。 VS2010会毫无问题地构建它,但是当我尝试执行它时,它会显示错误

无法加载DLL'sqlite3':无法找到指定的模块

我从sqlite网站下载了一个sqlite3.exe二进制文件,并将可执行文件下载到我的程序的可执行文件中,但是我的程序仍然在Windows上显示错误消息。


它看起来像在本地sqlite3二进制文件(sqlite3_open_v2)中找不到入口点。 System.data.SQLLite是一个托管的ado.net包装器,可以进行互操作。

你还有本地的sqlite3二进制文件吗? 他们位于这里:http://sqlite.org/download.html

编辑:

注意你使用单声道,下面的链接指向windows dll下载。 试过看过吗?

http://www.mono-project.com/SQLite


当你的程序是使用不同的.NET实现SQLite的客户端组件,以你得到包含单的一个,你的新议会正在调用不附带单sqlite的C库中存在的未管理的功能。

Mono在默认情况下使用config项目来重定向在请求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.Data.Sqlite的版本,那么您可能仍需要这样做。

链接地址: http://www.djcxy.com/p/44587.html

上一篇: Running Sqlite on Mono

下一篇: DLLImport crash in Mono (linux): icall