如何将const char * API导入C#?

时间:2009-02-03 18:03:04

标签: c# dllimport

鉴于此C API声明如何将其导入C#?

const char* _stdcall z4LLkGetKeySTD(void);

我已经能够做到这一点:

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

3 个答案:

答案 0 :(得分:12)

试试这个

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

然后,您可以使用Marshal.PtrToStringAnsi()将结果转换为String。您仍然需要使用适当的Marshal.Free *方法释放IntPtr的内存。

答案 1 :(得分:4)

始终使用C ++ const char *或char *而不是std :: string。

还要记住C ++中的char是C#中的sbyte 和unsigned char是C#中的一个字节。

建议在处理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());
 }

答案 2 :(得分:2)

只需使用'string'而不是'const char *'。

编辑:这是危险的,因为JaredPar解释道。如果您不想要免费,请不要使用此方法。