System.TypeInitializationException:““OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。”

unity3d游戏开发 专栏收录该内容
7 篇文章 0 订阅

问题:System.TypeInitializationException:““OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。”
在这里插入图片描述
下面有两种安装配置的过程,均产生上述问题,介绍配置过程及解决办法:
产生过程1:用Nuget下载安装GDAL和GDAL.Native后,直接放上示例代码运行,没配置任何环境变量,就产生上述问题。
步骤1:打开一个控制台应用(.NET Framework),项目——管理Nuget程序包——浏览,如下图
在这里插入图片描述
步骤2:搜索GDAL与GDAL.Native,安装。
在这里插入图片描述
步骤3:在Debug的配置管理器——新建——x64平台,运行代码,产生上述问题。
在这里插入图片描述
解决:安装完GDAL和GADL.Native后,在项目文件下会有一个GdalConfiguration.cs文件
在这里插入图片描述
打开,将配置文件代码替换成以下代码,

using System;
using System.IO;
using System.Reflection;
using Gdal = OSGeo.GDAL.Gdal;
using Ogr = OSGeo.OGR.Ogr;

namespace ConsoleApp7
{
    public static partial class GdalConfiguration
    {
        private static bool _configuredOgr;
        private static bool _configuredGdal;

        /// <summary>
        /// Function to determine which platform we're on
        /// </summary>
        private static string GetPlatform()
        {
            return IntPtr.Size == 4 ? "x86" : "x64";
        }

        /// <summary>
        /// Construction of Gdal/Ogr
        /// </summary>
        static GdalConfiguration()
        {
            var executingAssemblyFile = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase).LocalPath;
            var executingDirectory = Path.GetDirectoryName(executingAssemblyFile);

            if (string.IsNullOrEmpty(executingDirectory))
                throw new InvalidOperationException("cannot get executing directory");


            var gdalPath = Path.Combine(executingDirectory, "gdal");
            var nativePath = Path.Combine(gdalPath, GetPlatform());

            // Prepend native path to environment path, to ensure the
            // right libs are being used.
            var path = Environment.GetEnvironmentVariable("PATH");
            path = nativePath + ";" + Path.Combine(nativePath, "plugins") + ";" + path;
            Environment.SetEnvironmentVariable("PATH", path);

            // Set the additional GDAL environment variables.
            var gdalData = Path.Combine(gdalPath, "data");
            Environment.SetEnvironmentVariable("GDAL_DATA", gdalData);
            Gdal.SetConfigOption("GDAL_DATA", gdalData);

            var driverPath = Path.Combine(nativePath, "plugins");
            Environment.SetEnvironmentVariable("GDAL_DRIVER_PATH", driverPath);
            Gdal.SetConfigOption("GDAL_DRIVER_PATH", driverPath);

            Environment.SetEnvironmentVariable("GEOTIFF_CSV", gdalData);
            Gdal.SetConfigOption("GEOTIFF_CSV", gdalData);

            var projSharePath = Path.Combine(gdalPath, "share");
            Environment.SetEnvironmentVariable("PROJ_LIB", projSharePath);
            Gdal.SetConfigOption("PROJ_LIB", projSharePath);
        }

        /// <summary>
        /// Method to ensure the static constructor is being called.
        /// </summary>
        /// <remarks>Be sure to call this function before using Gdal/Ogr/Osr</remarks>
        public static void ConfigureOgr()
        {
            if (_configuredOgr) return;

            // Register drivers
            Ogr.RegisterAll();
            _configuredOgr = true;
        }

        /// <summary>
        /// Method to ensure the static constructor is being called.
        /// </summary>
        /// <remarks>Be sure to call this function before using Gdal/Ogr/Osr</remarks>
        public static void ConfigureGdal()
        {
            if (_configuredGdal) return;

            // Register drivers
            Gdal.AllRegister();
            _configuredGdal = true;
        }
    }
}

使用Gdal.AllRegister()初始化前,调用以下两句代码进行相关初始化数据的配置即可,如下图。
GdalConfiguration.ConfigureGdal();
GdalConfiguration.ConfigureOgr();
这个方法思路参考:https://blog.csdn.net/mygisforum/article/details/22478491 GDAL C# 开发环境配置
在这里插入图片描述
产生过程2:http://www.gisinternals.com/query.html?content=filelist&file=release-1911-gdal-2-3-2-mapserver-7-2-1.zip
在这里下载编译好的用于c#的zip文件,或者:http://www.gisinternals.com
步骤1:添加环境变量path:
在这里插入图片描述

  • (1)把包涵了gdal203.dll的文件夹路径加到环境变量path中,如下图所示:List item
  • (2)把包含了下面这8个dll的文件夹路径添加到path环境变量中,下图所示:
  • gdal_csharp.dll;
  • gdal_wrap.dll;
  • gdalconst_csharp.dll;
  • gdalconst_wrap.dll;
  • ogr_csharp.dll;
  • ogr_wrap.dll;
  • osr_csharp.dll;
  • osr_wrap.dll;
    在这里插入图片描述
    步骤2:打开vs2017,新建一个项目文件,叫ConsoleApp8。copy上面的8个dll到ConsoleApp8项目文件夹下的Debug文件夹中,同时,将gdal203.dll也放到Debug中。
    在这里插入图片描述
    步骤3:在vs2017,添加gdal_csharp.dll引用,如下:
    在这里插入图片描述
    添加代码运行,Debug选框将AnyCPU配置成x64平台,不会在"Gdal.AllRegister();"出现System.TypeInitializationException:““OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常。”问题了。
    主要原因还是没有添加环境变量,代码找不到gdal_csharp.dll路径。
    如果还有问题,试着将framework改为4.6试试吧,右键属性里,下图。
    在这里插入图片描述
    (unity3d配置过程也相同,配置环境变量,再将九个dll加到unity3d目录下的Assets/Plugins文件夹中)
    资源地址:https://download.csdn.net/download/qq_29413829/10808998
  • 0
    点赞
  • 0
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值