10

x64 ウィンドウで、spatialite 拡張 SQLite データベースを作成してアクセスする必要があります。

System.Data.SQLitesqlite-netFx45-static-binary-bundle-x64-2012-1.0.92.0.zip と呼ばれる最新バージョン 1.0.92.0 をダウンロードしました。これは私の Visual Studio (2012) プロジェクトから参照されており、それ自体で問題なく動作するようです。

また、spatialite-4.1.1-DLL-win-amd64.zip という最新のプリコンパイル済み x64 spatiaLiteバージョン 4.1.1 も持っています。spatialite のすべての dll は、実行中のディレクトリに存在します。

拡張機能をロードしようとすると:

using (var conn = new SQLiteConnection("Data Source=\"" + _sqLiteFullName + "\""))
{
    conn.Open();
    conn.EnableExtensions(true);
    conn.LoadExtension("libspatialite-4.dll");
    ...
}

行にAccessViolationException (保護されたメモリを読み取ろうとしました。これは多くの場合、他のメモリが破損していることを示しています) が発生しLoadExtension()ます。

PE Deconstructor (dll/exe のbitnewssを決定するソフトウェア) で見ると、System.Data.SQLite.dll (x64 パッケージから) のコピーが実際には 32 ビットであることがわかります。それが問題ですか?

これを解決するにはどうすればよいですか?

他の誰かが x64 で spatiaLite を動作させた方法を教えてください。

4

3 に答える 3

2

サイトから mod_spatialite をダウンロードし、mod_spatialite-4.2.0-win-amd64.7z を選択します。すべてのdllを解凍して、プログラムのbinフォルダーにコピーします。

サンプルコード:

//SELECT load_extension("mod_spatialite") // doesn't need the '.dll' suffix.

using (var cnn = new SQLiteConnection(connStr))
            {
                //connStr = "FullUri=file::memory:?cache=shared;Pooling=True;Max Pool Size=200;";


                cnn.Open();
                //cnn.EnableExtensions(true);

                using (SQLiteCommand mycommand = new SQLiteCommand("SELECT load_extension(\"mod_spatialite\")", cnn))
                {
                    mycommand.ExecuteNonQuery();
                }
于 2015-04-08T10:10:52.060 に答える