鉴于此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();
答案 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解释道。如果您不想要免费,请不要使用此方法。