2011-12-16 43 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版を使用している場合は、データベースファイルを暗号化/復号化できます。 1(sqlite-netFx40-静的 - バイナリ - バンドル--x64-2010-1.0.77.0.zip)。.NET4でSQLiteデータベースを暗号化/復号化できません

私のアプリがx86とx64の両方のプラットフォーム(すべてのCPUプロジェクトビルド設定)で動作する必要があります。私はADO.NET 4.0プロバイダ(SQLite-1.0.67.1-vs2010-net4-setup.exe)をインストールしようとしました。参照(プロジェクトを右クリックし、参照の追加、.NETタブ - > System.Data.SQLite)を追加し、プログラムを実行しました。私はファイルを復号化してのChangePassword(「MYPASS」)を呼び出すことによって、暗号化しようとすると、私は次の例外を取得:

System.EntryPointNotFoundExceptionがキャッチされた

メッセージを=エントリポイントが見つかりませんという名前'sqlite3_rekey'はDLL 'System.Data.SQLite.DLL'にあります。 ソース= System.Data.SQLite型名= "" のStackTrace:

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オブジェクトを使用して接続をオープンしようとしたと私は2つの異なる例外を取得します2つの異なる場合がある。ファイルが暗号化されていると私は私がこれを取得する接続文字列にパスワードを指定しない場合 まず、:

System.Data.SQLite.SQLiteExceptionがキャッチされた メッセージ=ファイルはデータベースではありません を開設ファイルのファイルは暗号化またはデータベース
ソース= System.Data.SQLiteのErrorCode = -2147467259 のStackTraceではありません。System.Data.SQLite.SQLite3.Prepare(SQLiteConnection CNN、文字列STRSQL、以前SQLiteStatementで 、

UInt32 timeoutMS、String & strRemain)System.Data.SQLite.SQLiteDataReaderでSystem.Data.SQLite.SQLiteDataReader.NextResult() でSystem.Data.SQLite.SQLiteCommand.GetStatement(のInt32インデックス) でSystem.Data.SQLite.SQLiteCommand.BuildNextCommand() でSystem.Data.SQLite.SQLiteConnection.OpenでSystem.Data.SQLite.SQLiteCommand.ExecuteNonQueryでSystem.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehaviorの 行動) で..ctor(SQLiteCommand CMD、CommandBehaviorの振る舞い) () (SQLiteTest.Database.GetAllLanguagesで) ()はC:\ SQLiteTest \ Database.cs:ライン216

第二に、私の広告であればdは接続文字列のパスワードパラメータ、上記のようなSystem.EntryPointNotFoundExceptionを取得します。

AnyCPUプラットフォームのC#アプリケーションで暗号化されたSQLiteデータベースを使用するには確実な方法を知っていますか?

ありがとうございます!

+0

ちょうど興味深いのは、.configファイルのエンドポイント設定用に2つの個別の設定/場所がありますか?あなたはコードを使ってこれを操作していますか? – MethodMan

+0

@DJKRAZE私は.configファイルを持っていません。データベース用のサービスアプリケーションです。すべてがコードから実行されます。 – antoine

+0

アセンブリやサービスをどのように消費しているかの例を示す必要がある場合があります – MethodMan

答えて

2

次のソリューションは少し汚れていますが、うまくいくかもしれませんが、私たちは暗号化されたデータベースを使用していないので、100%ではありません。 x64とx86用のsqlite dllの両方のバージョンをダウンロードし、別のフォルダに配置しました。我々は、手動でアセンブリロード時に私たちは

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

に接続インスタンスを取得します(Is64BitOperatingSystemという環境クラスのプロパティがあり、.NET 4から、我々はIntPtr.Sizeを確認してください)アプリケーションが現在実行されているプラ​​ットフォーム上で手動依存それらをロード私たちのプロジェクトでは、どのバージョンのsqliteも参照していません。