2012-01-11 71 views
4

我正在开发一个使用SQLite3数据库并需要在Windows和Linux之间交叉兼容的C#项目。在Mono上运行Sqlite

Linux服务器正在使用版本3.2.8,我正在使用Managed Sqlite Library DLL 1.0.66.0。

我抄DLL到服务器和当我运行单myexec.exe它显示以下错误

未处理的异常:System.EntryPointNotFoundException: sqlite3_open_v2在(包装管理到本机) System.Data.SQLite.UnsafeNativeMethods:sqlite3_open_v2 (字节[],IntPtr的&,整型,IntPtr的)在System.Data.SQLite.SQLite3.Open (System.String strFilename,SQLiteOpenFlagsEnum标志的Int32 maxPoolSize,布尔usePool) 0x00000] in:0 at System.Data.SQLite.SQLiteConnection.Open() [0x00000]中:0在AudioManagement.DatabaseConnection..ctor()[0x00000] 在:0在 LinuxAudioManager.Configure.startConfiguration()[0x00000]在 :0在LinuxAudioManager.Program.Main (System.String [ ] args)[0x00000] in:0

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

下面是我用的,为了创建连接

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

感谢您的帮助,您可以提供的代码。

UPDATE 我刚刚用单声道记录执行了我的程序,发现了一些相当奇怪的东西。它似乎有加载lib文件的问题。输出低于

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

DllImport加载位置:'libsqlite3.so.0.so'。单INFO:的DllImport

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

文件:没有这样的文件或目录”。 Mono-INFO:DllImport loading

库:'./libsqlite3.so.0.so'。单信息:错误的DllImport装载

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

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

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

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

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

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

DllImport加载位置:'libsqlite3.so.0.so'。单INFO:的DllImport

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

文件:没有这样的文件或目录”。 Mono-INFO:DllImport loading

库:'./libsqlite3.so.0.so'。单信息:错误的DllImport装载

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

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

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

'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文件和单不再说这couldn”加载一些东西。但是原来的EntryPointNotFoundException仍显示

更新3 感谢@bryanmac我已经改变使用Mono.Data.Sqlite DLL,而不是其下单在Linux上正常工作的代码。但是,在Windows中使用此DLL现在不再有效。 VS2010将建立它没有问题,但是当我试着执行它时它会显示错误

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

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

+0

您是否在Windows上试过Mono以查看它是否有效? – bryanmac 2012-01-11 18:21:19

+0

http://code.google.com/p/csharp-sqlite/切换到C#SQLite,你会忘记这些原生的混乱。但是,此C#端口确实存在一些已知问题(请查看问题页面)。 – 2012-05-03 03:01:28

回答

1

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

你还有本地的sqlite3二进制文件吗?它们都坐落在这里:http://sqlite.org/download.html

编辑:

你使用单声道及以下点你的下载链接到Windows DLL下载注意到。试过看过吗?

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

+0

我试过管理和非管理,但他们都似乎拿出相同的错误消息 – Boardy 2012-01-11 12:38:32

+0

当您使用托管的一个是从我指定的下载位置的sqlite3二进制文件,并排坐在一起吗? – bryanmac 2012-01-11 12:40:43

+0

他们有一个托管和非托管包装层与本机sqlite.org二进制文件互操作... – bryanmac 2012-01-11 12:41:21

4

当你的程序使用不同。将SQLite客户端程序集的网络实现添加到单声道中包含的程序集中,您的新程序集正在调用mono中随附的sqlite C库中不存在的未管理的函数。

默认情况下,配置项用于重定向用于请求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的版本,那么您可能仍然需要这样做。

+0

对不起,我不明白这是什么。目前它正在Linux下工作,没有问题。 Windows现在的问题是它无法找到该模块。对不起,如果我是一个noob我有点在Linux和Windows上使用Sqlite是非常新的 – Boardy 2012-01-11 15:32:06