C# 在Mono上运行Sqlite
我正在从事一个c#项目,该项目使用SQLite3数据库,需要在windows和linux之间实现交叉兼容 linux服务器使用的是3.2.8版,我使用的是托管Sqlite库DLL 1.0.66.0 我已将DLL复制到服务器,当我运行mono myexec.exe时,它会显示以下错误 未处理的异常:System.EntryPointNotFoundException: sqlite3_open_v2 at(包装器管理为本机) System.Data.SQLite.unsafentiveMethods:sqlite3\u open\u v2 (字节[],intptr&,int,intptr)位于System.Data.SQLite.SQLite3.Open (System.String strFilename、SQLiteOpenFlagsEnum标志、Int32 maxPoolSize,布尔usePool)[0x00000]英寸:0处 System.Data.SQLite.SQLiteConnection.Open()[0x00000]in:0 at AudioManagement.DatabaseConnection..ctor()[0x00000] in:0 at 中的LinuxAudioManager.Configure.startConfiguration()[0x00000] :0位于LinuxAudioManager.Program.Main (System.String[]args)[0x00000]位于:0中 当它试图创建数据库文件或打开连接时会抛出此错误,我不确定它是哪一个 下面是我用来创建连接的代码C# 在Mono上运行Sqlite,c#,linux,sqlite,mono,C#,Linux,Sqlite,Mono,我正在从事一个c#项目,该项目使用SQLite3数据库,需要在windows和linux之间实现交叉兼容 linux服务器使用的是3.2.8版,我使用的是托管Sqlite库DLL 1.0.66.0 我已将DLL复制到服务器,当我运行mono myexec.exe时,它会显示以下错误 未处理的异常:System.EntryPointNotFoundException: sqlite3_open_v2 at(包装器管理为本机) System.Data.SQLite.unsafentiveMethod
conn = new SQLiteConnection("Data Source=database.db");
conn.Open()
谢谢你能提供的帮助
更新
我刚刚用mono日志执行了我的程序,发现了一些非常奇怪的东西。它似乎在加载lib文件时遇到问题。输出如下
Mono信息:DllImport正在尝试加载:“libsqlite3.so.0”。单声道信息:
DllImport加载位置:“libsqlite3.so.0.so”。Mono信息:DllImport
加载库时出错:“libsqlite3.so.0.so:无法打开共享对象。”
文件:没有这样的文件或目录'。Mono信息:DllImport加载
库:'./libsqlite3.so.0.so'。Mono信息:DllImport加载错误
库“./libsqlite3.so.0.so:无法打开共享对象文件:无此类文件
文件或目录'。Mono信息:DllImport正在加载:“libsqlite3.so.0”
Mono信息:正在搜索“sqlite3\u open\u v2”。单声道信息:探测
“sqlite3\u open\u v2”。Mono信息:探测“sqlite3\u open\u v2”。单声道信息:
正在探测“sqlite3\u open\u v2A”。Mono信息:探测“sqlite3\u open\u v2A”
Mono信息:DllImport正在尝试加载:“libsqlite3.so.0”。单声道信息:
DllImport加载位置:“libsqlite3.so.0.so”。Mono信息:DllImport
加载库时出错:“libsqlite3.so.0.so:无法打开共享对象。”
文件:没有这样的文件或目录'。Mono信息:DllImport加载
库:'./libsqlite3.so.0.so'。Mono信息:DllImport加载错误
库“./libsqlite3.so.0.so:无法打开共享对象文件:无此类文件
文件或目录'。Mono信息:DllImport正在加载:“libsqlite3.so.0”
Mono信息:正在搜索“sqlite3\u open\u v2”。单声道信息:探测
“sqlite3\u open\u v2”。Mono信息:探测“sqlite3\u open\u v2”。单声道信息:
正在探测“sqlite3\u open\u v2A”。Mono信息:探测“sqlite3\u open\u v2A”
文件libsqlite3.so.0确实存在,但我不明白为什么mono会尝试加载它
libsqlite3.so.0.so
更新2
我认为第一次更新的错误消息指向了错误的方向,因为我创建了一个符号链接来匹配它找不到lib文件的位置,mono不再说它无法加载某些内容。但是,仍会显示原始EntryPointNotFoundException
更新3
多亏了@bryanmac,我将代码改为使用Mono.Data.Sqlite dll,它在Mono下的Linux上运行良好。但是,在Windows中使用此DLL现在不再有效。VS2010将毫无问题地构建它,但当我尝试执行它时,它将显示错误
无法加载DLL“sqlite3”:找不到指定的模块
我已经从sqlite网站下载了一个sqlite3.exe二进制文件,并将可执行文件下载到我的程序的可执行文件中,但我的程序仍然在Windows上显示错误消息。看起来它无法在本机sqlite3二进制文件(sqlite3\u open\u v2)中找到入口点。System.data.SQLLite是一个可进行互操作的托管ado.net包装器 您是否也有本机sqlite3二进制文件?它们位于: 编辑: 注意到您正在使用Mono,下面的下载链接指向windows dll下载。你试过看吗
由于您的程序使用的SQLite客户端程序集的.Net实现与mono附带的.Net实现不同,因此您的新程序集正在调用mono附带的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"/>
$grep-i sqlite/etc/mono/config
这在中进行了描述
您可以创建一个配置文件来覆盖为自己的程序为mono定义的默认值
请注意/
,它强制运行时查找库的exe所在的文件夹
如果您决定使用与Mono附带的版本不同的Mono.Data.Sqlite,那么您可能仍然需要执行此操作。我尝试了托管和非托管,但在使用托管版本时,它们似乎都会出现相同的错误消息。托管版本是我指定下载位置的sqlite3二进制文件,与它们并排坐着?它们有一个托管和非托管包装层,可以与本机sqlite.org二进制文件进行互操作……不,它们来自我下载了纯托管二进制文件和普通二进制文件。从你提供的链接中,我不确定要尝试下载哪一个。谢谢你在这方面的帮助。请参阅更新3,它现在可以在Linux下工作,但不能在Windows下工作。对不起,我不明白它的作用。目前,它可以在Linux的mono环境下正常工作。问题是Windows现在说它找不到该模块。对不起,如果我是