7

鉴于此 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();
4

3 回答 3

12

试试这个

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

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

于 2009-02-03T18:12:07.910 回答
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());
 }
于 2011-08-17T02:08:20.703 回答
2

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

编辑:由于 JaredPar 解释的原因,这很危险。如果您不想要免费,请不要使用此方法。

于 2009-02-03T18:05:38.657 回答