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();
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.
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());
}
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.