在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.dllmsvcp71.dllmsvcr71.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成功编译和运行示例:

  1. 从http://www.gisinternals.com/下载GDAL sdk(在我的情况下是64位)
  2. 执行SDKShell.bat脚本以设置系统环境路径等。
  3. 在Visual Studio中创建项目。 并引用所有.net dll(名称以_csharp.dll结尾的_csharp.dll ),位于下载SDK中的\bin\gdal\csharp\
  4. 将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进行了测试。