在C#中使用GDAL时出现exception
我开始在我的应用程序中使用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添加到我的应用程序时,会显示以下消息:
作为对此的更新,现在由SharpMap团队维护的GDAL作为nuget包在此定期更新。 您需要为项目安装“GDAL.Native”和“GDAL”包以使用GDAL库。 一旦通过nuget安装,它们将自动创建一个“GdalConfiguration.cs”,您可以在启动之前调用它来初始化GDAL路径。 唯一需要注意的是,软件包被设置为自动将其相应的GDAL库复制到输出构建目录。 如果您需要部署应用程序,则需要做一些额外的工作。
为了解决这个问题,我按照这里的描述下载了预构建的库,并从这里获取了FWTools。
我使用的非托管DLL来自\install_dir\FWTools2.4.7\bin
和来自\install_dir\FWTools2.4.7\csharp
的C#包装器。
gdal14.dll
, msvcp71.dll
和msvcr71.dll
来自这里 ,在第一个链接中提到。
您收到的错误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
)你应该没问题。
我知道这是一个老问题,但我相信我的回答可能对某人有所帮助。
通过执行以下操作,我能够使用c#gdal成功编译和运行示例:
- 从http://www.gisinternals.com/下载GDAL sdk(在我的情况下是64位)
- 执行
SDKShell.bat
脚本以设置系统环境路径等。 - 在Visual Studio中创建项目。 并引用所有.net dll(名称以
_csharp.dll
结尾的_csharp.dll
),位于下载SDK中的\bin\gdal\csharp\
- 将Visual Studio项目设置中的平台目标设置为x64以消除不良图像格式exception。 如果我选择使用32位版本的SDK,那么最后一步就没有必要了。
我根本没有安装fwtools。 似乎fw_tools的最后一个版本相对较旧,并且仍然保留了sdk。
我知道这是一个相当古老的问题,但我在谷歌自己研究了同样的问题之后发现了这一点,所以这意味着对于这个错误的搜索,这仍然是一个非常相关的页面要更新,因为它仍然位于前5位。当搜索到同样的问题时,大G
就我而言,“DeusExMachina25”和“GrzegorzSławecki”的答案引起了共鸣。
我正在编写一些软件,利用NUGet上当前构建的“清晰地图”(截至2016年6月24日),我的软件不断抛出与OP最初报告相同的gdal_wrap消息,即使我正在使用Sharpmap团队提供的GDAL包。
我没有意识到该软件包的NUGet安装程序已经为我安装了一个配置类,但是在阅读完这个post并发现它之后我就去寻找它了。
果然我在我的项目中找到了’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数据文件,插件和其他一些内容的路径。
您可以尝试使用Dependency Walker查看是否有任何gdal_csharp试图抓取的dll但不能。
您是否已将GDAL库的路径添加到PATH环境变量中? 我从http://vbkto.dyndns.org/sdk/?_sm_au_=iVVqjsHS2n46WP00下载了我的文件,这是我的路径:C:\ libs \ release-1600-gdal-1-9-mapserver-6-2 \ bin。
要使用GDAL的C#绑定,您需要安装FWTools(来自http://fwtools.maptools.org/ )以及与您的系统匹配的最新二进制文件(来自http://vbkto.dyndns.org/) sdk / )。 之后,重要的是在PATH变量中包含FWTools的bin目录(64位系统示例: C:\ Program Files(x86)\ FWTools2.4.7 \ bin )以及必要的dll( gdal_csharp.dll
被提及)在问题中)在Visual Studio项目引用中。 我在这里概述了完整的流程。
这个过程适用于32位和64位系统,我使用VS 2010和2012进行了测试。