通过在C#中使用Gdal,我遇到了一个很奇怪的问题。
这是我的代码,在Visual Studio中使用GDAL的NuGet:
g = ggplot(dataset,aes(x=data[,1],y=data[,2],group=1)) +
geom_point() + geom_line()
for (i in 2:4) {
g = g + geom_point(aes(x=data[,1],y=data[,i+1],group=i)) +
geom_line(aes(x=data[,1],y=data[,i+1],group=i))
}
g
可悲的是,运行这段代码时出现异常。它告诉我它无法加载名为“ gdalconst_wrap”的DLL 。
但是,DLL在Debug文件夹中的正确位置。但是,如果我将其从专用文件夹中删除(bin / Debug / gdal / x64),将其放入调试文件夹的根目录(bin / Debug),我收到一个新异常,告诉我存在“试图在受保护的内存中读取或写入”的内容。
我尝试使用DLL的x86版本或在GDAL官方网站上在线找到的其他版本;可悲的是,那什么都没改变。
到目前为止,我在几个似乎有类似问题的人的论坛上找到了几个话题;但显然没有人回答。对我自己来说,我很困,非常感谢您的帮助。
-编辑-
显然,问题似乎与Gdal常量“ GA_Update”有关。
据我所知,Ogr的“打开”功能需要有关如何打开文件的指令:只读或更新模式。为此,它需要一个“ int”类型的对象,该对象是Gdal用作该函数的第二个参数的常量的一部分。我使用常量“ GA_Update”来表示我可能要编辑文件(如GDAL网站上的教程中有关如何打开文件的指示所示)。 该常数是一个“ int”,但似乎是从“ gdalconst_wrap.dll”中读取了它的“ int”值。
如果我将代码的最后一行替换为
// Launch the Gdal Configuration + loading of drivers before everything
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
Gdal.AllRegister();
// Try to load the shapefile with "pathOfShapefile" being the string containing the path of the file
DataSource test = Ogr.Open(ConfigurationManager.AppSettings["pathOfShapefile"], GdalConst.GA_Update);
该异常不再发生,并且代码似乎在运行。据我所试,这适用于建议作为该函数的第二个参数的任何“ int”值。但是,我不知道所选int值的作用是什么,以及open函数如何解释它。如果有更多了解,我将进行第二次编辑。
因此,我认为读取“ gdalconst_wrap.dll”中的常量值有问题,并且NuGet软件包“ GDAL”可能会将其放在错误的位置。