在Mono上运行Sqlite

时间:2012-01-11 12:17:20

标签: c# linux sqlite mono

我正在开发一个使用SQLite3数据库的c#项目,需要在windows和linux之间交叉兼容。

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

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

  

未处理的异常:System.EntryPointNotFoundException:   sqlite3_open_v2 at(包装器托管到原生)   System.Data.SQLite.UnsafeNativeMethods:sqlite3_open_v2   System.Data.SQLite.SQLite3.Open上的(byte [],intptr&,int,intptr)   (System.String strFilename,SQLiteOpenFlagsEnum标志,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   :LinuxAudioManager.Program.Main为0   (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'。单声道信息:DllImport

     

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

     

文件:没有这样的文件或目录'。单信息:DllImport加载

     

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

     

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

     

文件或目录'。 Mono-INFO:DllImport loading:'libsqlite3.so.0'。

     

Mono-INFO:搜索'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'。单声道信息:DllImport

     

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

     

文件:没有这样的文件或目录'。单信息:DllImport加载

     

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

     

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

     

文件或目录'。 Mono-INFO:DllImport loading:'libsqlite3.so.0'。

     

Mono-INFO:搜索'sqlite3_open_v2'。单一信息:探索

     

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

     

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

文件libsqlite3.so.0确实存在,但我看不出为什么单声道然后尝试加载 libsqlite3.so.0.so。

更新2 我认为第一次更新错误消息指向我错误的方向,因为我创建了一个符号链接,以匹配无法找到lib文件的地方,而mono不再说它无法加载某些内容。但是仍然显示原始的EntryPointNotFoundException

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

  

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

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

2 个答案:

答案 0 :(得分:4)

由于您的程序正在使用SQLite客户端程序集的不同.N​​et实现,而单元格中包含该程序,您的新程序集正在调用一个un-managed函数,该函数在随单声道附带的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.Data.Sqlite的不同版本,那么你可能仍然需要这样做。

答案 1 :(得分:1)

看起来它无法在本机sqlite3二进制文件中找到入口点(sqlite3_open_v2)。 System.data.SQLLite是一个托管的托管ado.net包装器。

您是否也拥有原生的sqlite3二进制文件?它们位于:http://sqlite.org/download.html

编辑:

注意到你正在使用Mono,下面的下载链接指向windows dll下载。试过看了吗?

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