我开始在我的应用程序中使用 gdal_csharp dll并读取geotiff文件。但它说:
The type initializer for 'OSGeo.GDAL.GdalPINVOKE' threw an exception.
这是我的代码
string fileName = @"/path to geotiff file";
OSGeo.GDAL.Dataset DS =
OSGeo.GDAL.Gdal.Open(fileName, OSGeo.GDAL.Access.GA_ReadOnly);
任何人都可以帮忙吗?
修改
我有这些dll
这是完整的错误消息:
它表示无法加载gdal_wrap
。但是,当我要将dll添加到我的应用程序时,会显示以下消息:
答案 0 :(得分:13)
作为对此的更新,现在由SharpMap团队维护的GDAL作为nuget包here定期更新。您需要为项目安装“GDAL.Native”和“GDAL”包才能使用GDAL库。一旦通过nuget安装,它们将自动创建一个“GdalConfiguration.cs”,您可以在启动之前调用它来初始化GDAL路径。唯一需要注意的是,软件包被设置为自动将其相应的GDAL库复制到输出构建目录。如果您需要部署应用程序,则需要做一些额外的工作。
答案 1 :(得分:4)
为了解决这个问题,我按照here所述下载了预建库,并从here抓取了FWTools。
我使用的非托管DLL来自\install_dir\FWTools2.4.7\bin
和来自\install_dir\FWTools2.4.7\csharp
的C#包装。
gdal14.dll
,msvcp71.dll
和msvcr71.dll
来自here,在第一个链接中提及。
您收到的错误gdal_wrap.dll
指的是其中一个依赖项。我把那个DLL扔进了depends
,它找到了一个冗长的依赖库列表。请注意,由于我使用FWTools发行版,此列表可能更长 - 如果您从源代码构建版本,它可能看起来不同,但适用相同的原则。
要使上述代码在我的机器上运行,我的输出目录中有以下文件:
gdal14.dll
gdalconst_csharp.dll
gdalconst_wrap.dll
gdal_csharp.dll
gdal_fw.dll
gdal_wrap.dll
geos_fw.dll
geotiff_fw.dll
hdf5dll.dll
hdf_fw.dll
jpeg12_osgeo.dll
jpeg_osgeo.dll
libcurl.dll
libeay32.dll
libexpat.dll
libmysql.dll
libpq.dll
libtiff_fw.dll
lti_dsdk_dll.dll
mfhdf_fw.dll
msvcp71.dll
msvcr71.dll
NCScnet_fw.dll
NCSEcw_fw.dll
NCSUtil_fw.dll
netcdf.dll
ogdi_32b1.dll
proj.dll
sqlite3.dll
ssleay32.dll
szlibdll.dll
xerces-c_2_7.dll
zlib1.dll
zlib_osgeo.dll
现在这些并不一定都必须存在于输出目录中 - 只要它们在你的路径上某处(例如,\Windows\System32
)你应该没事。
答案 2 :(得分:4)
我知道这是一个老问题,但我相信我的回答可能对某人有帮助。
通过执行以下操作,我能够使用c#gdal成功编译和运行示例:
SDKShell.bat
脚本以设置系统环境路径等_csharp.dll
结尾的那些),位于已下载SDK中的\bin\gdal\csharp\
我根本没有安装fwtools。似乎fw_tools的最后一个版本相对较旧,并且仍然保留了sdk。
答案 3 :(得分:3)
我知道这是一个相当古老的问题,但我在谷歌自己研究了同样的问题之后发现了这一点,所以这意味着对于这个错误的搜索,这仍然是一个非常相关的页面要更新,因为它仍然在顶部当搜索到同样的问题时,来自大G的5。
就我而言,“DeusExMachina25”和“GrzegorzSławecki”的答案引起了共鸣。
我正在编写一些软件,利用NUGet当前版本的“清晰地图”(截至2016年6月24日),我的软件不断抛出与OP最初报道的相同的gdal_wrap消息,即使我' m使用Sharpmap团队提供的GDAL包。
我没有意识到该软件包的NUGet安装程序已经为我安装了一个配置类,但是在阅读完这个帖子并发现它之后我就去寻找它了。
果然我在我的项目中找到了'GdalConfiguration.cs'文件,并在我项目的适当位置添加了一个调用,期望GDAL能够正确初始化。
然而,在我这样做之后,我仍然遇到了同样的问题。
所以,我在已添加的GDAL例程的开头设置了一个断点,并一直等到断点被击中。
然后我跟踪了该方法,最终找到了以下行:
var gdalPath = Path.Combine(executingDirectory, "gdal");
在文件的第64行附近。
通过这个跟踪,我注意到正在构建的路径是:
d:\geodata\maptest\maptest\bin\debug\gdal
但NUGet安装程序已在
中安装了所有依赖程序集d:\geodata\maptest\maptest\bin\debug
正是我所期望的那样。
我更改了第64行,现在读取:
var gdalPath = Path.Combine(executingDirectory, "");
瞧,错误消失了,一切都开始起作用了。
我本可以用另一种方式做事,并创建了一个名为gdal的文件夹,然后将所有内容复制到该文件夹中,但是当我对项目进行“清理”时,它就会被删除。
自配置类以来,根据此路径设置各种环境变量,快速更改该行还可以修复GDAL数据文件,插件和其他一些内容的路径。
答案 4 :(得分:1)
您可以尝试使用Dependency Walker查看是否有任何gdal_csharp试图抓取但不能抓取的dll。
答案 5 :(得分:0)
您是否已将GDAL库的路径添加到PATH环境变量中?我从http://vbkto.dyndns.org/sdk/?_sm_au_=iVVqjsHS2n46WP00下载了我的文件,这是我的路径:C:\ libs \ release-1600-gdal-1-9-mapserver-6-2 \ bin。
答案 6 :(得分:0)
要使用GDAL的C#绑定,您需要安装FWTools(来自 http://fwtools.maptools.org/ )以及与您的系统匹配的最新二进制文件(来自 {{ 3}} 的)。之后,重要的是要包含FWTools的 bin 目录(64位系统示例: C:\ Program Files(x86)\ FWTools2.4.7 \ bin )在Visual Studio项目引用中,PATH变量以及问题中提到的必要dll(gdal_csharp.dll
)。我概述了完整的流程http://vbkto.dyndns.org/sdk/。
此过程适用于32位和64位系统,我使用VS 2010和2012进行了测试。
答案 7 :(得分:0)
从系统变量中删除python的路径。因为主要的gdal路径与python 27冲突