How to import const char* API to C#?

2019-02-07 06:31发布

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

标签: c# dllimport
3条回答
闹够了就滚
2楼-- · 2019-02-07 06:38

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());
 }
查看更多
做自己的国王
3楼-- · 2019-02-07 06:39

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.

查看更多
The star\"
4楼-- · 2019-02-07 06:57

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.

查看更多
登录 后发表回答