15

我开始在我的应用程序中使用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 添加到我的应用程序时,会显示以下消息:

在此处输入图像描述

4

9 回答 9

18

作为对此的更新,SharpMap 团队现在将 GDAL 作为一个 nuget 包维护在这里,它会定期更新。您需要为您的项目安装“GDAL.Native”和“GDAL”包才能使用 GDAL 库。一旦通过 nuget 安装,它们将自动创建一个“GdalConfiguration.cs”,您可以在启动之前调用该“GdalConfiguration.cs”来初始化 GDAL 路径。唯一需要注意的是软件包设置为自动将其适当的 GDAL 库复制到您的输出构建目录。如果您需要部署应用程序,您将不得不做一些额外的工作。

于 2016-06-01T19:42:36.177 回答
5

为了解决这个问题,我下载了这里描述的预建库并从这里获取了 FWTools 。

我使用的非托管 DLL\install_dir\FWTools2.4.7\bin来自\install_dir\FWTools2.4.7\csharp.

gdal14.dllmsvcp71.dllmsvcr71.dll来自这里,在第一个链接中提到。

您收到的错误 regdal_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)你应该没问题。

于 2013-02-05T08:51:59.947 回答
5

我知道这是一个老问题,但我相信我的回答可能会对某人有所帮助。

通过执行以下操作,我能够使用 c# gdal 成功编译和运行示例:

  1. 从http://www.gisinternals.com/下载 GDAL sdk (在我的情况下为 64 位)
  2. 执行SDKShell.bat脚本设置系统环境路径等
  3. 在 Visual Studio 中创建项目。并引用所有 .net dll(名称以 结尾的_csharp.dll),位于\bin\gdal\csharp\下载的 SDK中
  4. 将 Visual Studio 项目设置中的平台目标设置为 x64 以消除错误的图像格式异常。如果我选择使用 32 位版本的 SDK,则不需要最后一步。

我根本没有安装 fwtools。看起来 fw_tools 的最后一个版本比较旧,sdk 仍在维护。

于 2015-12-09T14:47:27.230 回答
3

我知道这是一个相当老的问题,但我在自己研究了同样的问题后在谷歌中发现了这个,所以这意味着对于这个错误的搜索,这仍然是一个非常相关的更新页面,因为它仍然在前 5 名搜索相同问题时的大 G。

就我而言,引起共鸣的是“DeusExMachina25”和“Grzegorz Sławecki”的答案。

我正在编写一些使用 NUGet 上当前构建的“锐图”的软件(截至 2016 年 6 月 24 日),我的软件一直抛出与 OP 最初报告的相同的 gdal_wrap 消息,即使我正在使用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 数据文件、插件和其他一些东西的路径。

于 2016-06-24T21:24:51.157 回答
1

您可以尝试使用 Dependency Walker 来查看是否有 gdal_csharp 试图抓取但不能抓取的任何 dll。

于 2013-01-29T17:56:44.837 回答
1

您是否已将 GDAL 库的路径添加到 PATH 环境变量中?我从http://vbkto.dyndns.org/sdk/?_sm_au_=iVVqjsHS2n46WP00下载了我的文件,这是我的路径:C:\libs\release-1600-gdal-1-9-mapserver-6-2\bin。

于 2013-02-14T13:20:39.937 回答
0

要使用 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 对其进行了测试。

于 2013-05-06T21:16:41.310 回答
0

从系统变量中删除 python 的路径。因为主要的gdal路径与python 27冲突

于 2019-07-02T14:41:18.167 回答
0

您是否忘记:

GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();

Gdal.AllRegister();
Ogr.RegisterAll();
于 2021-12-20T20:05:28.793 回答