【问题标题】:Unable to connect to SQlite using mono无法使用单声道连接到 SQlite
【发布时间】:2015-11-07 17:58:05
【问题描述】:

在我的程序中,我有这个简单的代码:

using System;
using System.Data;
using Mono.Data.SqliteClient;

.... 
IDbConnection cnx = new SqliteConnection("URI=file:reestr.db");
cnx.Open();
....

这就是我编译它的方式:

$ mcs Test.cs -r:System.Data.dll -r:mono.data.sqliteclient.dll

编译正常。但是当我使用./Test.exe 运行它时,我会收到以下错误消息:

程序集中缺少方法 .ctor .... 未处理的异常: System.IO.FileNotFoundException:无法加载文件或程序集“Mono.Data.SqliteClient,Version=2.0.0.0,Culture=neutral,PublicKeyToken=0738eb9f132ed756”或其依赖项之一。 文件名:'Mono.Data.SqliteClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756'

我不确定我在这里做错了什么以及如何修复它。

PS。我使用 Ubuntu 作为我的操作系统。

【问题讨论】:

  • 呸,好像我做到了。虽然本教程 - mono-project.com/docs/database-access/providers/sqlite - 完全具有误导性,并没有带来预期的结果。关键因素是安装正确的 dll。 Mono.Data.SqliteClient.dll - 不是正确的,至少在我的情况下它会产生错误。正确的库是Mono.Data.Sqlite.dll

标签: c# sqlite mono


【解决方案1】:

Mono.Data.SqliteClient 似乎找不到原生 SQLite 二进制文件:

先决条件 如果您没有 SQLite,请下载它。有 适用于 Windows 和 Linux 的二进制文件。您可以将 .dll 或 .so 放在一边 您的应用程序二进制文件,或系统范围的库路径。

参考:http://www.mono-project.com/docs/database-access/providers/sqlite/

要为您的平台获取预编译的本机二进制文件(或源代码):

另外,如果您安装了 SQLite 本机共享库,它们是否可以通过 dlopen 获得?如果没有,您可以分配 LD_LIBRARY_PATH 环境。 var 以便 Mono 可以在运行时找到它们。

Linux 共享库搜索路径 在 dlopen(3) 手册页中, 程序所需的必要共享库在 以下顺序:

用户的 LD_LIBRARY_PATH 中以冒号分隔的目录列表 环境变量。这是一种常用的方式来让原生 由 CLI 程序找到的共享库。图书馆名单 缓存在 /etc/ld.so.cache 中。 /etc/ld.so.cache 是通过编辑创建的 /etc/ld.so.conf 并运行 ldconfig(8)。编辑 /etc/ld.so.conf 是 搜索其他目录的首选方式,而不是 使用 LD_LIBRARY_PATH,因为这样更安全(更难 将特洛伊木马库放入 /etc/ld.so.cache 而不是插入它 到 LD_LIBRARY_PATH)。 /lib,然后是 /usr/lib。

Ubuntu 笔记:

$ sudo apt-get install sqlite
$ ls -1  /usr/lib/libsqlite*
/usr/lib/libsqlite.so.0
/usr/lib/libsqlite.so.0.8.6
$ export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
$ mono ./Test.exe

【讨论】:

  • 不,我不在 Windows 上。我正在使用 Ubuntu。
  • 你安装了 SQLite 吗?尝试通过mono --trace ./Test.exe 运行以查看是否找到了 SQLite 本机 (.so) 提供程序。
  • 请注意,我在编译期间没有收到任何错误。正如我在问题中所说,我只在运行程序时收到错误消息。
  • 是的,我已经安装了。我什至用其他语言(Java 和 Python)连接到 SQLite。只有 C# 的问题
  • 那是运行时cmd,不编译:mono --trace ./Test.exe
【解决方案2】:

我以这种方式解决了我的 Mac 中的问题。右键单击 Mono.Data.Sqlite 上的引用,然后单击本地副本。这会使单声道复制 dll 到调试文件夹,您的应用程序将找到该库。
OBS:对不起我的英语不好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2018-01-12
    • 2023-04-01
    相关资源
    最近更新 更多