2011-12-16 169 views
1

我在Windows 7 x64上運行Visual Studio 2010。我正在編寫的應用程序應該在所有平臺上運行(AnyCPU)。我能夠加密/解密數據庫文件,如果我使用System.Data.SQLite.dll x86版本(sqlite-netFx40-static-binary-bundle-Win32-2010-1.0.77.0.zip)或x64一個(sqlite-netFx40-static-binary-bundle-x64-2010-1.0.77.0.zip)。無法在.NET4中加密/解密SQLite數據庫

我需要我的應用程序在x86和x64這兩個平臺上運行(任何CPU項目構建設置)。我試過安裝ADO.NET 4.0 Provider(SQLite-1.0.67.1-vs2010-net4-setup.exe)。我添加了引用(右鍵單擊項目,添加引用,.NET選項卡 - > System.Data.SQLite)並運行該程序。如果我解密文件,並嘗試通過調用ChangePassword(「爲mypass」)來加密,我得到以下異常:

System.EntryPointNotFoundException被抓獲

消息=無法找到一個切入點命名DLL'System.Data.SQLite.DLL'中的'sqlite3_rekey'。 源= System.Data.SQLite類型名= 「」 堆棧跟蹤:

at System.Data.SQLite.UnsafeNativeMethods.sqlite3_rekey(IntPtr db, Byte[ key, Int32 keylen) 
    at System.Data.SQLite.SQLite3.ChangePassword(Byte[ newPasswordBytes) 
    at System.Data.SQLite.SQLiteConnection.ChangePassword(Byte[ newPassword) 
    at System.Data.SQLite.SQLiteConnection.ChangePassword(String newPassword) 
    at SQLiteTest.Database.Encrypt() in C:\SQLiteTest\Database.cs:line 166 

另外,我嘗試使用SQLiteConnection對象打開連接,我得到兩個不同的例外在兩種不同的情況下。 首先,如果該文件被加密,我不指定連接字符串中的密碼,我得到這樣的:

System.Data.SQLite.SQLiteException被抓獲 消息=打開的文件 不是一個數據庫文件的文件被加密或不是數據庫
源= System.Data.SQLite錯誤碼= -2147467259 堆棧跟蹤: 在System.Data.SQLite.SQLite3.Prepare(SQLiteConnection CNN,字符串STRSQL,SQLiteStatement以前,

UInt32 timeoutMS,字符串& strRemain) at System.Data.SQLite.SQLiteCommand.BuildNextCommand() at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index) at System.Data.SQLite.SQLiteDataReader.NextResult() at System.Data.SQLite.SQLiteDataReader ..ctor(SQLiteCommand CMD,表現得的CommandBehavior) 在System.Data.SQLite.SQLiteCommand.ExecuteReader(的CommandBehavior 行爲) 在System.Data.SQLite.SQLiteCommand.ExecuteNonQuery() 在System.Data.SQLite.SQLiteConnection.Open () 在SQLiteTest.Database.GetAllLanguages()在C:\ SQLiteTest \ Database.cs:線216

其次,如果我的廣告d密碼參數到連接字符串,我得到像上面那樣的System.EntryPointNotFoundException。

那麼,有沒有人知道在AnyCPU平臺上的C#應用​​程序中使用加密SQLite數據庫的確定方法?

在此先感謝!

+0

只是好奇你有2個獨立的設置/位置的終端安裝在.config文件..?或者你是通過代碼操縱這個? – MethodMan 2011-12-16 14:36:52

回答

2

下面的解決方案有點髒,但它可能工作,我們沒有使用加密的數據庫,所以我不是100%,如果這將適用於你。 我們爲x64和x86下載了兩個版本的sqlite dll,並將它們放在不同的文件夾中。我們加載它們依賴於手動什麼平臺上的應用程序正在運行(我們檢查IntPtr.Size,從.NET 4中有叫Is64BitOperatingSystem環境類的屬性),當我們與

var sqliteConnectionType = assembly.GetType("System.Data.SQLite.SQLiteConnection"); 
(DbConnection)Activator.CreateInstance(sqliteConnectionType); 

加載的程序集手動,我們得到連接實例我們不會在我們的項目中使用任何版本的sqlite。