我们有一个运行在.NET 4.5下的Windows桌面上的现有应用程序。我们使用带有密码的system.data.sqlite来加密数据库文件。我们一直在努力修改我们的应用程序,使其在Windows、Linux和Mac上跨平台运行。
我已经能够使用编译本机libsqlite.interop.so库
these
指令。只要没有密码,我的测试程序就可以在Windows和Linux上运行。当我在连接字符串中包含密码时,在Windows中运行会像预期的那样工作,但是在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
cnBuilder.Password
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 .$FSI_0001.main@ () [0x00041] in :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源代码将包含相同的加密逻辑,而不管它在哪里编译,因此我对这不起作用的原因感到困惑。是否需要包含更多的编译器标志以启用加密,或者编译库的系统是否需要其他依赖项?请帮忙。