前边已经写过利用swig1.3.40编译C#版本的GDLA没有出现问题,按照GDAL2.0编译之添加HDF库编译C#版本该文章可以正常编译成功。
今天博主利用swig3.0.6版对GDLA2.2.4进行C#编译遇到了各种问题,然后借助网络查找解决方案,最终解决,现将遇到的问题以及解决方案总结如下:
C++版本正常编译,然后进入swig/csharp文件夹下进行编译,执行如下两个命令:
nmake -f makefile.vc interface
nmake -f makefile.vc
第一个命令可以正常执行,没有问题;
然后执行第二个命令,到最后出现好多错误
1. 未能找到类型或命名空间“IDisposable”
解决此问题需要将swig/csharp文件夹下的AccessmblyInfo.cs,以及gdal、ogr、osr三个文件夹下的所有.cs文件开始添加以下两行代码
using System;
using System.Runtime.InteropService
2. 安全透明代码无法调用(本次编译过程中未遇到此问题)
解决方案为,将swig/csharp文件夹下的AccessmblyInfo.cs文件下的96行左右位置的代码屏蔽
[assembly: AllowPartiallyTrustedCallers]
3. 接口重复定义,OSGeo.OSR.OsrPINVOKE 已定义一个名为“OsrPINVOKE”具有相同参数类型的成员的函数
解决方案为,将swig/csharp文件夹下的gdal、osr、ogr三个文件夹下的GdalPINVOKE.cs、OsrPINVOKE.cs、OgrPINVOKE.cs三个文件中分别找到GdalPINVOKE()、OsrPINVOKE()、OgrPINVOKE()三个静态函数,每个都有两个,将其中一个屏蔽即可
4. 接口成员名称错误,OSGeo.GDAL.GdalPINVOKE 并不包含BandUpcast、DatasetUpcast、DriverUpcast的定义
解决方案为, 将swig/csharp文件夹下的gdal文件夹中找到band.cs、dataset.cs、driver.cs三个文件,将三个文件中的构造函数Band()、Dataset()、Driver()中调用的GdalPINVOKE.BandUpcast、GdalPINVOKE.DatasetUpcast、GdalPINVOKE.DriverUpcast分别修改为GdalPINVOKE.Band_SWIGUpcast、GdalPINVOKE.Dataset_SWIGUpcast、GdalPINVOKE.Driver_SWIGUpcast即可
同时在对上述四个问题进行修改的时候不要执行以下的两个命令命令,
nmake -f makefile.vc interface
nmake -f makefile.vc clean
第一个命令是重新生成所有.cs文件的,会将你的修改全部覆盖,第二个命令是将所有.cs文件删除的,我在编译过程中就出现了这两个问题,导致重新修改cs文件,全部修改完毕后执行下边一个命令即可得到8个dll,对于GDAL2.2.4版本生成的C#版本gdal就下swig/csharp文件夹下,同时调用的时候要将依赖的所有dll拷贝防止出现异常错误
nmake -f makefile.vc