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.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编译过程中会出现如下问题:
问题1、接口重定义
osr\OsrPINVOKE.cs(,): error CS0111: 类型“OSGeo.OSR.OsrPINVOKE”已定义了一个名为“OsrPINVOKE”的具有相同参数类型的成员
osr\OsrPINVOKE.cs(,): (与前一个错误相关的符号位置) 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(,): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“BandUpcast”的定义
gdal\Dataset.cs(,): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DatasetUpcast”的定义
gdal\Driver.cs(,): 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],如下图所示

类似的问题解决方法相同。
gdal编译C#开发版本的更多相关文章
- zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下. 版本编译引导 zlib在windows上的mingw32 ...
- VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4
对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...
- 如何搭建SBT编译Scala开发的Android工程
作者:戚明峰 最近接触了shadowsocks的Android客户端项目源码(https://github.com/shadowsocks/shadowsocks-android),刚好这个项目是使用 ...
- 手动编译PHP开发环境
目录 手动编译PHP开发环境 问题复盘 部署环境及配置 目标环境 安装部署环境开始 首先安装PHP 安装mysql 安装nginx 手动编译PHP开发环境 这是一篇来自深夜加班的手稿 问题复盘 你有没 ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- [转载]Linux 环境下编译 0.11版本内核 kernel
最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...
- 由源代码编译SpriteBuilder最新版本1.5.0搭配最新的Cocos2D 3.4.9
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 大家知道SpriteBuilder版本停留在1.4.9已经很久 ...
- Android 开发版本统一
一.概述 对于 Android 开发版本的统一涉及到的东西就是 Gradle 中的全局设置,我们通过配置 gradle 也就是编写 Groovy 代码将开发中的版本号设置为全局参数.这样就能够在 mo ...
- win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建
win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...
随机推荐
- 用DotNetBar设计的 Gradient Buttons 漂亮按钮
http://www.webdesignerwall.com/demo/css-buttons.html public class GradientButtons : DevComponents ...
- Linux下实现获取远程机器文件
创建公钥秘钥实现无密码登录后即可获取到文件内容了!! A:xxx.xxx.6.xxx B:xxx.xxx.xxx.x 一.创建 A机器 ssh-keygen -t rsa 二.拷贝——将生成的公钥复制 ...
- 欢迎进入Node.js世界
官网上(http://www.nodejs.org )给Node下的定义是:”一个搭建在Chrome JavaScript 运行时上的平台,用于构建高速.可伸缩的网络程序.Node.js采用的事件驱动 ...
- php数据库访问
从$res获取行数据的时候,处理mysql_fetch_row($res),还有三个方法,分别是 mysql_fetch_row($res); 返回一个所以的数组,速度较快. mysql_fetch_ ...
- Spring4.1新特性——Spring MVC增强
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- Zero Requiem
“最后是在游行.暴君鲁路修高居王座,两侧列着所有反对者的代表:黑色骑士团.黎星刻.原圆桌骑士名列第三的吉诺,以及一身女囚装的娜娜丽,他们都即将被公开处死.尤菲米娅在第一次“特别行政区•日本”成立仪式上 ...
- poj 1416 (hdu 1539)Shredding Company:剪枝搜索
点击打开链接 题目大意是有一个分割机,可以把一串数字分割成若干个数字之后求和,题目输入一个数字上界和待分割的数字,让我们求出分割后数字之和在不超过给定max的情况下的最大值,并且给出分割方案,如果没有 ...
- tracer
http://people.canonical.com/~acelan/coscup-2010/Debugging%20Linux%20Kernel%20by%20Ftrace.pdf http:// ...
- 用于列出选项的Windows窗体控件
可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListB ...
- 对Web标准的理解。可用性和可访问性
一Web标准 简单的说,就是HTML.CSS.JavaScript这三者分离.WEB标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentat ...