Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import const char* API to C#?

Tags:

c#

dllimport

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

const char* _stdcall z4LLkGetKeySTD(void);

I've been able to get this far:

   [DllImport("zip4_w32.dll",
       CallingConvention = CallingConvention.StdCall,
       EntryPoint = "z4LLkGetKeySTD",
       ExactSpelling = false)]
   private extern static const char* z4LLkGetKeySTD();
like image 588
Mike Chess Avatar asked Feb 03 '09 18:02

Mike Chess


3 Answers

Try this

   [DllImport("zip4_w32.dll",
       CallingConvention = CallingConvention.StdCall,
       EntryPoint = "z4LLkGetKeySTD",
       ExactSpelling = false)]
   private extern static IntPtr z4LLkGetKeySTD();

You can then convert the result to a String by using Marshal.PtrToStringAnsi(). You will still need to free the memory for the IntPtr using the appropriate Marshal.Free* method.

like image 168
JaredPar Avatar answered Nov 10 '22 21:11

JaredPar


Always use C++ const char* or char* and not std::string.

Also keep in mind that char in C++ is a sbyte in C# and unsigned char is a byte in C#.

It is advisable to use unsafe code when dealing with DllImport.

[DllImport("zip4_w32.dll",
   CallingConvention = CallingConvention.StdCall,
   EntryPoint = "z4LLkGetKeySTD",
   ExactSpelling = false)]
 private extern static sbyte* or byte* z4LLkGetKeySTD();

 void foo()
 {
   string res = new string(z4LLkGetKeySTD());
 }
like image 37
Robert Avatar answered Nov 10 '22 19:11

Robert


Just use 'string' instead of 'const char *'.

Edit: This is dangerous for the reason JaredPar explained. If you don't want a free, don't use this method.

like image 26
Serafina Brocious Avatar answered Nov 10 '22 20:11

Serafina Brocious