gdal编译C#开发版本

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

1、下载gdal源码

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

我下载的是最新的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.0\VC\vcvarsall.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.10\swig.exe

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

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

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

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

问题1、接口重定义

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

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

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

gdal\Band.cs(17,79): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“BandUpcast”的定义 gdal\Dataset.cs(17,82): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DatasetUpcast”的定义 gdal\Driver.cs(17,81): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DriverUpcast”的定义 NMAKE : fatal error U1077: “C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.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:\warmerda\bld文件夹下会生成scharp文件,供C#编程使用。

4、测试程序报错

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

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

解决办法:

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

using System.Security;
[SecuritySafeCritical]

截图如下:

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

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

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

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

时间: 2024-11-06 15:39:28

gdal编译C#开发版本的相关文章

win8.1 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

win8.1 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的好处:可以调试的时候看OpenCV的源代码. 重编译要得到的东西:Debug版本和Release版本的dll,lib,头文件.(dll添加到环境变量里,运行时用,自己编译的dll调试时可以跟踪到Opencv的源码内:lib和头文件配置到编译器里) PS:如果只是使用Opencv而不需要跟踪源码,则使用Opencv自带的库文件即可.跳到5配置Opencv开发环境,对应的文件都在..\opencv\b

Ceph编译:L版本及其之后的版本

Ceph编译:L版本及其之后的版本. 1. 编译前准备 下载代码库 git clone git://github.com/ceph/ceph.git all 或者 git clone --recursive https://github.com/ceph/ceph.git 假如想看v13.2.2的代码 只clone一个分支的: git clone -b v10.2.5 --single-branch git://github.com/ceph/ceph.git single 如果想看v13.2.

OpenWrt 开发版本主trunk MT7620N 无线驱动bug

环境: OpenWrt Development Trunk: svn co svn://svn.openwrt.org/openwrt/trunk/ BUG: 1. 无线无法建立连接. 2. 无线建立连接获取IP地址失败,断开连接. 出现问题的时候会伴随以下dmesg [ 3702.380000] ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Dropping frame due to full tx queue 2 [ 3702.390

MongoDB开发版本3.1.8发布

MongoDB 3.1.8版本已发布.值得注意的是此次3.1.8作为开发版本,并不适用于生产环境中使用.接来下的3.2系列版本将供广大用户作为生产环境中使用,敬请期待. 新特性和修改: SERVER-785:支持过滤(部分)索引SERVER-2227:每个索引访问的统计SERVER-12015:可使用聚合操作再次覆盖索引SERVER-19007:内置专门模块负责诊断数据捕获SERVER-19551:为了有效地删除旧记录而保持"里程碑"去应对WT引擎下的oplog日志SERVER-199

win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号的dll,lib,头文件.(dll加入到环境变量里,执行时用,自己编译的dll调试时能够跟踪到Opencv的源代码内:lib和头文件配置到编译器里) PS:假设仅仅是使用Opencv而不须要跟踪源代码,则使用Opencv自带的库文件就可以. 跳到5配置Opencv开发环境.相应的文件都在..\ope

在Windows下编译多种VS版本的Skia

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/51272050 这几天刚改了改Duilib,之前为了让Duilib更好的支持透明异形窗体所以把Duilib改为Gdi和Gdi+的双渲染引擎.于是想到了有时间就把渲染引擎完全独立为渲染接口,可以增加更多的渲染引擎.现在来说Skia是个很不错的渲染,之前我只是单独编译了VS2013的Skia做来简单的测试使用,要想把它加到Duilib就得完全编译好Skia并且支持各个版本的V

[转载]Linux 环境下编译 0.11版本内核 kernel

最近在看<linux内 核0.11完全注释>一书,由于书中涉及汇编语言的地方众多,本人在大学时汇编语言学得一塌糊涂,所以实在看不下去了,头都大了只好匆匆看了个头尾(前面 几章和最后一章).看来即使有<九阴真经>这样的武功秘籍,内功不够也是修炼不出来神马来的.于是索性下了个0.11版本的kernel下来尝试编译一 把. linux-0.11.tar.gz 下载地址: 下面开始工作: 1. tar xvfz linux-0.11.tar.gz 2. cd linux-0.11 3. m

让VC编译的Release版本程序在其他机器上顺利运行

链接的时候分静态链接和动态链接两种. 静态连接的话,基本上就不需要向目标机器拷贝附加的文件了,方法如下: 1.修改编译选项,将/MD或/MDd 改为 /MT或/MTd,这样就实现了对VC运行时库的静态链接,在运行时就 不再需要VC的dll了. 2.工程->属性->配置属性->常规->MFC的使用,选择“在静态库中使用mfc”. 动态连接的话,需要在目标机器上拷贝mfc所依赖的动态库.根据你使用的VC版本不同而不同: VC6的话,一般包括mfc42.dll.msvcrt.dll.ms

Android 开发版本统一

一.概述 对于 Android 开发版本的统一涉及到的东西就是 Gradle 中的全局设置,我们通过配置 gradle 也就是编写 Groovy 代码将开发中的版本号设置为全局参数.这样就能够在 module 或者 library 中访问同一份版本号,从而实现统一.Gradle 中的全局设置方式有以下几种: 工程 build.gradle ext方法 gradle.properties文件 -p参数 二.全局设置 1. 工程 build.gradle allprojects { apply pl