获得适用于x64 c的SpatiaLite + SQLite系统#
我需要在x64窗口下创建和访问一个spaceite扩展的SQLite数据库。
我已经下载了System.Data.SQLite的最新版本1.0.92.0,名为sqlite-netFx45-static-binary-bundle-x64-2012-1.0.92.0.zip
。 它是从我的Visual Studio(2012)项目中引用的,并且它本身似乎工作得很好。
我还有最新的预编译x64 spatiaLite版本4.1.1,名为spatialite-4.1.1-DLL-win-amd64.zip来自spatialite的所有dll都存在于执行目录中。
当我尝试加载扩展时:
using (var conn = new SQLiteConnection("Data Source=\"" + _sqLiteFullName + "\"")) { conn.Open(); conn.EnableExtensions(true); conn.LoadExtension("libspatialite-4.dll"); ... }
我在LoadExtension()
行上得到一个AccessViolationException (试图读取受保护的内存。这通常表明其他内存已损坏)。
我注意到使用PE Deconstructor (确定dll / exe的bitnewss的软件),它说我的System.Data.SQLite.dll(来自x64包)的副本实际上是32位。 这是问题吗?
我该如何解决这个问题?
有没有其他人让spatiaLite在x64上工作?
实际上,问题可能出在spatialite-4.dll这个autmun我花了一个星期试图修复同样的问题而没有成功。 看起来像spatialite-4.dll中存在问题(我的意思是这个下载的forms是gaia-sin(官方空间网站))你可以尝试从源代码构建一个Spatialite(如噩梦(:)或试图寻找另一个构建.dll。第二个选项帮助了我。顺便说一下,你需要使用几个.dll来使用Spatialite扩展:
- libsqlite3-0.dll
- libgeos-3-0-2.dll
- libgeos-C-1.DLL
- libiconv2.dll
- libproj-0.dll
- libvirtualtext-2.DLL
- libspatialite-2.dll <----- Spatialite v.2完全适合我的项目。 正如我所说,如果你需要v.4,你可以尝试构建它或寻找另一个构建。 希望这可以帮助
从该站点下载mod_spatialite,选择mod_spatialite-4.2.0-win-amd64.7z。 将所有dll解压缩并复制到程序的bin文件夹中。
示例代码:SELECT load_extension(“mod_spatialite”)//不需要’.dll’后缀。
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(); }
在此处查看此Google网上论坛讨论:
https://groups.google.com/forum/#!topic/spatialite-users/u2QZpQL_6ek
最新的解决方案是Dominik:
我刚刚发现, http ://blog.jrg.com.br/2016/04/25/Fixing-spatialite-loading-problem/中描述的黑客只适用于mingw64的第二个最新版本的dll
来自http://netassist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_x86_64-linux_20131228.tar的 mingw-w64-bin_x86_64-linux_20131228.tar.bz2 。 bz2 。
任何尝试使用sourcefourge http://sourceforge.net/projects/mingw-w64/files/latest/download上提供的最新版本的尝试都在我的系统上失败。但是,我绝对可以确认,我可以加载mod_spatialite
MyConnection.LoadExtension("mod_spatilite");