• gdal编译C#开发版本


    gdal的编译比较麻烦,情况有很多种,今天我编译的gdal遇到的问题就和以前的有点不一样,仅供参考借鉴。

    1、下载gdal源码

         gdal源码下载地址:https://trac.osgeo.org/gdal/wiki/DownloadSource

        已经编译好的gdal版本下载地址:http://www.gisinternals.com/

       我下载的是最新的gdal211,不知道为什么,后面编译出来的是gdal201的版本。

    2、开始编译C++的开发版本

      gdal在window编译提供的方法:http://trac.osgeo.org/gdal/wiki/BuildingOnWindows

     为了编译64位的gdal,我修改了nmake.opt文件189行处的代码将#WIN64=YES 改成了WIN64=YES

    然后使用cmd设置编译环境:

    call "C:Program Files (x86)Microsoft Visual Studio 10.0VCvcvarsall.bat" amd64

    然后进入到gdal目录,依次执行如下命令:

    1、C:GDAL> nmake /f makefile.vc
    2、C:GDAL> nmake /f makefile.vc install
    3、C:GDAL> nmake /f makefile.vc devinstall

    编译完后会在C盘下面生成warmerda文件夹,里面的文件是用来提供C++编译的,如下图:

    注意:如果编译环境设置错误,第一步编译完后会提示如下错误:

     3、编译C#使用的版本

    编译C#使用的版本需要借助swig工具,下载地址如下:http://prdownloads.sourceforge.net/swig/swigwin-3.0.10.zip

    下载完后解压,打开nmake.opt,将swig=swig.exe修改成SWIG =E:swigwin-3.0.10swig.exe

    然后接着上面三句编译命令之后,进入到swigcsharp目录下,执行如下命令:

    1、nmake /f makefile.vc
    2、nmake /f makefile.vc install

    注意:在1编译过程中会出现如下问题:

    借鉴博客:GDAl编译C#,Python支持出现的错误

    问题1、接口重定义

    osrOsrPINVOKE.cs(192,10): error CS0111: 类型“OSGeo.OSR.OsrPINVOKE”已定义了一个名为“OsrPINVOKE”的具有相同参数类型的成员
    osrOsrPINVOKE.cs(188,10): (与前一个错误相关的符号位置) NMAKE : fatal error U1077: “C:WindowsMicrosoft.NETFrameworkv4.0.30319csc.EXE”: 返回代码“0x1

       解决办法:进入到..gdal-1.9.2swigcsharpgdal|ogr|osr三个文件夹下,找到GdalPINVOKE.cs、OgrPINVOKE.cs、OsrPINVOKE.cs,将提示中重复的参数类型删除掉即可,错误示例如下图:

    问题2:接口成员名称调用错误,错误提示:

    gdalBand.cs(17,79): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“BandUpcast”的定义 
    gdalDataset.cs(17,82): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DatasetUpcast”的定义
    gdalDriver.cs(17,81): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DriverUpcast”的定义
    NMAKE : fatal error U1077: “C:WindowsMicrosoft.NETFrameworkv4.0.30319csc.EXE”: 返回代码“0x1

    GdalPINVOKE.cs定义接口如下:

    Band类(举一例)调用如下:

    将三个类中的接口修改一下即可:

    public Driver(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Driver_SWIGUpcast(cPtr), cMemoryOwn, parent) { swigCPtr = new HandleRef(this, cPtr); 

    public Dataset(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Dataset_SWIGUpcast(cPtr), cMemoryOwn, parent) { swigCPtr = new HandleRef(this, cPtr);

    public Band(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Band_SWIGUpcast(cPtr), cMemoryOwn, parent) { swigCPtr = new HandleRef(this, cPtr);

     修改完后即可编译成功,编译成功之后C:warmerdald文件夹下会生成scharp文件,供C#编程使用。

    4、测试程序报错

    问题1、测试程序注册gdal时出现错误

    System.MethodAccessException”类型的未经处理的异常出现在 gdal_csharp.dll 中。 
    其他信息: 安全透明方法“OSGeo.GDAL.Gdal.AllRegister()”尝试通过方法“OSGeo.GDAL.GdalPINVOKE.AllRegister()”调用本机代码失败。方法必须是安全关键的或安全可靠关键的,才能调用本机代码。

    解决办法:

    修改swig生成的C#封装类代码,强制声明为可被安全透明代码调用即可,以..swigcsharpgdalGdal.cs类和..swigcsharpgdalDataset.cs类为例,在其类声明的开头添加下述两行代码:

    using System.Security;
    [SecuritySafeCritical]

    截图如下:

    如果还出现上面问题,依次添加 [SecuritySafeCritical] 即可。

    问题2、测试程序成功之后出现错误:

    解决办法,同样的在Geometry的Dispose方法上加入 [SecuritySafeCritical],如下图所示

    类似的问题解决方法相同。

     

  • 相关阅读:
    java applet传参和接收
    如何开启to 日志
    Linux重启网卡的方法
    java下载远程文件到本地
    下载文件使用缓存(一次性读取到内存),优化性能(注意静态对象修改需要加锁)
    浏览器地址传中文解决方法 URLEncoder.encode(str,"编码") new URLDecoder().decode(str,"编码")
    根据端口号(http和https的)跳转到不同的工程
    删除某个文件夹下的所有文件(或一类执行文件)
    http和https访问jsp传送中文参数
    根据取模选择不同的列表
  • 原文地址:https://www.cnblogs.com/GIScore/p/5966470.html
Copyright © 2020-2023  润新知