当 运行 on Linux 使用密码时,SQLite 抛出 "EntryPointNotFoundException: sqlite3_key" 异常

SQLite throws "EntryPointNotFoundException: sqlite3_key" exception when running on Linux with a password

我们在 .net 4.5 下的 Windows 桌面上有一个 运行 的现有应用程序。我们使用 System.Data.SQLite 和密码来加密数据库文件。我们一直致力于在 Windows、Linux 和 Mac.

上将我们的应用程序修改为 运行 跨平台

我已经能够使用 these 指令编译本机 libSQLite.Interop.so 库。只要没有给出密码,我的测试程序就可以在 Windows 和 Linux 上运行。当我在连接字符串中包含密码时,运行ning in Windows 会按预期工作,但是 运行ning on Linux 会导致异常。我的测试代码是 F# 脚本:

#r "System.Data.SQLite.dll"

open System
open System.Data.SQLite

let dbFile = @"test.db"
let pw = "this is my super secure password"
let cnBuilder = SQLiteConnectionStringBuilder()
cnBuilder.DataSource <- dbFile
cnBuilder.Password <- pw

let cn = new SQLiteConnection(cnBuilder.ToString())
cn.Open()
...

引发此异常:

System.EntryPointNotFoundException: sqlite3_key
  at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods.sqlite3_key(intptr,byte[],int)
  at System.Data.SQLite.SQLite3.SetPassword (System.Byte[] passwordBytes) [0x0000b] in <226287aa71b9481b9dd405c36cfaba76>:0 
  at System.Data.SQLite.SQLiteConnection.Open () [0x005c5] in <226287aa71b9481b9dd405c36cfaba76>:0 
  at <StartupCode$FSI_0001>.$FSI_0001.main@ () [0x00041] in <d78f800532b445c4abcca81cff853dd6>:0 
  at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0003b] in <7b0d87324cab49bf96eac679025e77d1>:0

我假设 System.Data.SQLite 源代码将包含相同的加密逻辑,无论它是在何处编译的,因此我很困惑为什么这不起作用。是否需要包含更多编译器标志以启用加密,或者编译库的系统是否需要额外的依赖项?请帮忙。

经过进一步研究,我发现非Windows平台的加密是not supported

推荐的解决方案是使用 implimentation that supports encryption and include it yourself in your project. An alternative approach can be found here