Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Mono上运行Sqlite_C#_Linux_Sqlite_Mono - Fatal编程技术网

C# 在Mono上运行Sqlite

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

我正在从事一个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中

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

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

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现在说它找不到该模块。对不起,如果我是