Исключение при использовании GDAL в С#

Я начал использовать dll gdal_csharp в своем приложении и прочитал файл 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);

может кто-нибудь помочь?

Edit:

У меня эти dll

enter image description here

Это полное сообщение об ошибке:

enter image description here

В нем говорится, что невозможно загрузить gdal_wrap. Но когда я собираюсь добавить эту DLL в мое приложение, появится следующее сообщение:

enter image description here

Ответ 1

В качестве обновления к этому сейчас GDAL поддерживается командой SharpMap как пакет nuget здесь, который регулярно обновляется. Вам нужно будет установить пакет GDAL.Native и GDAL для вашего проекта, чтобы использовать библиотеку GDAL. После установки через nuget они автоматически создадут "GdalConfiguration.cs", который вы вызываете, чтобы инициализировать пути GDAL перед запуском. Единственное, что нужно отметить, это настроить пакеты, чтобы автоматически копировать соответствующие библиотеки GDAL в ваш каталог вывода. Если вам нужно развернуть приложение, вам придется немного приложить дополнительные усилия.

Ответ 2

Чтобы решить эту проблему, я загрузил готовые библиотеки, как описано здесь, и схватил FWTools из .

Неуправляемые библиотеки DLL, которые я использовал, пришли из \install_dir\FWTools2.4.7\bin и оболочки С# из \install_dir\FWTools2.4.7\csharp.

gdal14.dll, msvcp71.dll и msvcr71.dll пришли из здесь, который упоминается в этой первой ссылке.

Ошибка, которую вы получаете re 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), вы должны быть в порядке.

Ответ 3

Я знаю, что это старый вопрос, но я считаю, что мой ответ может помочь кому-то.

Мне удалось успешно скомпилировать и запустить примеры с помощью С# gdal, выполнив следующие действия:

  • Загрузка GDAL sdk из http://www.gisinternals.com/ (64 бит в моем случае)
  • Выполнение SDKShell.bat script для установки путей к системной среде и т.д.
  • Создание проекта в Visual Studio. И ссылаясь на все .ll dll (те, что имена заканчиваются на _csharp.dll), расположенные в \bin\gdal\csharp\ внутри загруженного SDK
  • Настройка целевой платформы платформы в настройках проекта Visual Studio на x64 для устранения исключений формата плохого изображения. Последний шаг не понадобится, если я выберу 32-битную версию SDK для работы.

Я вообще не устанавливал fwtools. Похоже, что последняя сборка fw_tools относительно старая, и sdk по-прежнему поддерживается.

Ответ 4

Я знаю, что это довольно старый вопрос сейчас, но я нашел это в google после того, как сам исследовал ту же проблему, поэтому это означает, что для поиска по этой ошибке это все еще очень актуальная страница для обновления, учитывая, что она все еще находится в верхней части 5 из большого G при поиске той же проблемы.

В моем случае это были ответы от "DeusExMachina25" и "Grzegorz Sławecki", которые поразили аккорд.

Я пишу какое-то программное обеспечение, которое использует текущие сборки "острой карты" на NUGet (по состоянию на 24 июня 2016 года), и мое программное обеспечение продолжало бросать то же сообщение gdal_wrap, что и OP, о котором сообщалось ранее, m, используя пакет GDAL, предоставленный командой Sharpmap.

Я не понимал, что установщик 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, плагинам и некоторым другим вещам.

Ответ 5

Вы можете попробовать использовать Dependency Walker, чтобы узнать, есть ли какие-либо DLL файлы, которые gdal_csharp пытается захватить, но не могут.

Ответ 6

Добавили ли вы путь к своим библиотекам GDAL в переменную среды PATH? Я загрузил свои файлы из http://vbkto.dyndns.org/sdk/?_sm_au_=iVVqjsHS2n46WP00 и вот мой путь: C:\libs\release-1600-gdal-1-9-mapserver-6 -2\Bin.

Ответ 7

Чтобы использовать С# -обязания GDAL, вам нужна установка FWTools (от http://fwtools.maptools.org/), а также самые последние бинарные файлы, которые соответствуют вашей системе (от http://vbkto.dyndns.org/sdk/). Впоследствии важно включить каталог bin FWTools (пример для 64-битных систем: C:\Program Files (x86)\FWTools2.4.7\bin) в переменной PATH, а также необходимые DLL (gdal_csharp.dll) в вопросе) в ссылках проекта Visual Studio. Я описал полные процессы здесь.

Этот процесс работает как с 32-битными, так и с 64-битными системами, я тестировал его с VS 2010 и 2012.

Ответ 8

Удалите путь к python из системных переменных. Потому что основные пути GDAL конфликтуют с Python 27