有人可以帮助/指导我在 Linux (MONO) 和 Windows (.NET) 上使用 SQLite lib
在 Linux 上我使用原生的 mono sqlite 客户端,在 Windows 上我使用http://sqlite.phxsoftware.com/
有没有办法像这样定义“使用”指令:
#if (linux)
using Mono.Data.Sqlite;
#else
using System.Data.SQLite;
另一个问题是两种实现方式的细微差别,例如:
cmd = new SqliteCommand(); // mono
cmd = new SQLiteCommand(); // sqlite.phxsoftware.com
等待任何帮助
如果您知道更好或更简单的方法来做到这一点,它将非常感谢您提供信息。
谢谢
您可以使用 csharp-sqlite,它是 Sql-Lite 的 C# 端口。它非常活跃,基于 3.6.22 版本的 SqlLite。请参阅 Miguel 的评论关于尝试加快速度的尝试。
我最近也遇到了这个问题:使用 Visual Studio 在 Windows 上构建一个使用 Sqlite 的应用程序,并将其部署在 Ubuntu Server 机器上进行生产。
我找到的最简单的解决方案是为 Sqlite 使用 Mono 驱动程序:Mono.Data.Sqlite.
事情本来可以更简单一些,但是 .Net 4.0 有一个 的错误 尚未打包在官方 Mono 版本中。
所以你必须从源代码编译 Mono(一般说明在这里):
当然你可以“交叉编译”:我已经在 Ubuntu Server 上构建了 Mono,并在 Windows .Net 项目中使用了 dll。
然后确保您的库路径中有本地 Sqlite 库(Windows 的 sqlite3.dll 和 Linux 的 sqlite3.so):对于 Windows,我只是将 sqlite3.dll 复制到 Mono.Data.Sqlite.dll 旁边程序集,对于 Linux,它应该开箱即用。
您的项目应该可以在 Windows/.Net 和 Linux/Mono 环境中无缝运行。
您可以使用别名解决命名差异
#if (linux)
using SqlCommand = Mono.Data.Sqlite.SqliteCommand;
#else
using SqlCommand = System.Data.SQLite;
我认为针对不同的构建使用不同的程序集是一项更复杂的任务。您可以查看 MSBuild 文档
有一个完全托管的 SQLite 翻译。如果你使用它,那么你可以在 Mono 和 Windows 上使用相同的 DLL。
解决问题的另一种方法是创建自己的数据库接口,然后在单独的 DLL 中为 Mono 实现该接口一次,为 Microsoft .NET 实现一个接口。 (基本上与创建针对不同数据库运行的代码的方式相同)
您可以只对软件的 Windows 和 Linux 版本使用 SQLite 的单声道实现。只需在您的软件包中包含 SQLite 的单声道程序集并在本地引用它。
正如您可以在上一篇文章中阅读here,您可以在您的代码中单独使用单声道的托管方式,并且只需要以不同的方式重新分配 windows 的本机部分。但是您不必通过它来处理托管实现和冗余代码。
开源 Vici CoolStorage ORM 库使用该平台的 SQLite 驱动程序在 Windows (.NET)、Mono(Mac、Linux 和 Windows)和 MonoTouch(iPhone)上运行。
要在这些不同的平台上使用它,您无需对源代码进行任何更改。只需重新编译,它应该可以工作。
IMO 你应该首先尝试找到一个在 Windows 和 Linux 中都能工作的实现。如果这不起作用,请创建一个为 SQLite 定义通用接口的程序集,并将所有“#if LINUX”代码放入该程序集中。然后在主应用程序中使用该程序集,以避免主应用程序因所有 # 定义而混乱。
SQLite ADO.NET 提供程序实际上是一个混合模式程序集,其中包含原生的SQLite 库。当然,这个本地库在 Windows 和 Linux 上是不一样的,所以这个提供者在 Linux 上不起作用。但是,提供程序有一个仅托管版本(下载页面上的SQLite-1.0.65.0-managedonly-binaries.zip)。所以我认为你只需要使用这个版本的提供者,并提供足够的原生 SQLite 动态库(Windows 上的 .dll,Linux 上的 .so)
一些答案建议 SQLite3 的完全托管 C# 端口。但是,不幸的是,尽管可以使用 Mono C# 编译器进行编译,但迄今为止还没有版本支持 Linux 或 Mac OS X。
未来的版本将使用 Mono 运行时在那些非 Windows 平台上正确运行。需要注意的是,源存储库包含有效的代码。
话虽如此,sqlite.org 提供的 System.Data.SQLite 实现可在 Windows 和非 Windows 平台上与 .Net 和 Mono 一起使用。您只需要确保 Mono 在运行时使用的 app.config 将 (C++) SQLite3 dll 映射到适当的 .so 或 .dylib 库。如果你选择“混合模式”版本,那么它应该 just work 你不需要担心单独的 dlls.