当 运行 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。
我们在 .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。