How to import void * C API into C#?

12,755

Solution 1

For the void* parameter you can just use an IntPtr

  [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);

Solution 2

You can also use void* if you mark your class as unsafe.

It really depends on what the API is looking for in that parameter.

You can add IntPtr or Object* to get past compiler, but you will still need to pass it the correct data when you call it.

Share:
12,755
Mike Chess
Author by

Mike Chess

Developing software for about 14 years; moving heavily into C# development for the last 2 years or so.

Updated on June 04, 2022

Comments

  • Mike Chess
    Mike Chess almost 2 years

    Given this C API declaration how would it be imported to C#?

    int _stdcall z4ctyget(CITY_REC *, void *);
    

    I've been able to get this far:

       [DllImport(@"zip4_w32.dll",
            CallingConvention = CallingConvention.StdCall,
            EntryPoint = "z4ctygetSTD",
            ExactSpelling = false)]
        private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
    

    Naturally in C# the "void *" doesn't compile.

    Some Googling indicates that it should be translated as "object." Which seems like it should work. But others indicate that "Void * is called a function pointer in C/C++ terms which in C# terms is a delegate". That doesn't make a whole lot of sense here as what would it delegate to? Some similar calls for other APIs found through Googling use other functions in the respective API. But in this API no other call would make sense.

    The documentation for the call shows an example:

    z4ctyget(&city, “00000”);
    

    Which seems to show that even a static value could be passed.

    It will compile with object in place of the void *. I don't know whether this is right and I haven't had an opportunity to test it (licensing issue).

  • Erik Forbes
    Erik Forbes about 15 years
    Darn you Jared, 30 seconds! Darn you straight to heck! -- =P
  • JaredPar
    JaredPar about 15 years
    @Erick :) Had few quick draw wins today
  • Mike Chess
    Mike Chess about 15 years
    The C declaration I showed was pulled straight from the .h file provided by USPS.
  • Stephen Martin
    Stephen Martin about 15 years
    The documentation from 2007 shows my declaration. In any case, the "00000" example shows that the expected input is a string (almost certainly ANSI). So my C# declaration should be what you are looking for.