[gdal-dev] CSharp bindings question

Asa Packer apacker at biosonicsinc.com
Wed Jun 10 11:07:10 PDT 2015


Hello again,

Sorry, I posted this using the Nabble gateway, and the text I formatted as
raw text did not come through correctly in email.  Here is another try.

-Asa
---
Hello, 

I am new to GDAL, and SWIG.  I spent yesterday getting GDAL 1.11.2 compiled
and ran into similar errors trying to build the C# bindings as are being
discussed on this thread.  I am on Windows (7 Pro SP1 x64) using Visual
Studio 2013's command prompt.  I am using the current version of swigwin,
3.0.5. 

FWIW, I was able to fix the errors by making the following changes.  Since I
don't really understand what SWIG is doing very well, I'm not sure how safe
these are, although they seem fairly minor.  I apologize if this has already
been discussed somewhere else - I'm reporting them just in case they are
helpful. 

1. Change line 95 of
gdal-1.11.2/swig/include/csharp/swig_csharp_extensions.i from 
  public $csclassname(IntPtr cPtr, bool cMemoryOwn, object parent) :
base($modulePINVOKE.$csclassnameUpcast(cPtr), cMemoryOwn, parent) {
to 
  public $csclassname(IntPtr cPtr, bool cMemoryOwn, object parent) :
base($modulePINVOKE.$csclassname_SWIGUpcast(cPtr), cMemoryOwn, parent) {

This fixes errors saying that the upcast function does not exist.  These
errors happen starting with SWIG 2.0.0. 

2. Delete lines 12-17 of
gdal-1.11.2/swig/include/csharp/swig_csharp_extensions.i - this fixes the
duplicate static constructor error CS0111.  This error is related to the
following entry from the SWIG changelog http://www.swig.org/Release/CHANGES.
The change was first released in SWIG 2.0.0. 

2010-05-23: wsfulton
            [C#] Fix #2957375 - SWIGStringHelper and SWIGExceptionHelper not
always being
            initialized before use in .NET 4 as the classes were not marked
beforefieldinit.
            A static constructor has been added to the intermediary class
like this:

              %pragma(csharp) imclasscode=%{
                static $imclassname() {
                }
              %}

            If you had added your own custom static constructor to the
intermediary class in
            the same way as above, you will have to modify your approach to
use static variable
            initialization or define
SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR - See csharphead.swg.

	    *** POTENTIAL INCOMPATIBILITY ***

3. Add the "-DSWIG2_CSHARP" flag to my SWIG variable in
gdal-1.11.2/nmake.local.  This fixes numerous errors about basic .NET types
like IntPtr not being defined.  This is related to the following entry from
the SWIG changelog, first released in version 3.0.0: 

2013-11-09: wsfulton
            [C#] Apply patch #79 from Brant Kyser
              - Remove using directives from the generated C# code and fully
qualify the use of all .NET
                framework types in order to minimize potential name
collisions from input files defining
                types, namespace, etc with the same name as .NET framework
members.
              - Globally qualify the use of .NET framework types in the
System namespace
              - Remove .NET 1.1 support, .NET 2 is the minimum for the C#
module

            This is a potential backwards compatibility break if code has
been added relying on these using
            statements that used to be generated:

              using System;
              using System.Runtime.InteropServices;

            The quick fix to add these back in is to add the -DSWIG2_CSHARP
command line option when
            executing SWIG. See CSharp.html documentation for more info.

            *** POTENTIAL INCOMPATIBILITY  ***

Thanks!  I appreciate all the work that you and others have done to make
GDAL so nice. 

Asa




More information about the gdal-dev mailing list