2009-02-03 65 views
7

鉴于此C API声明它将如何导入到C#?如何将const char * API导入C#?

const char* _stdcall z4LLkGetKeySTD(void); 

我已经能够远远得到这个:

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

回答

12

试试这个

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

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

2

只要使用的,而不是 '为const char *' '串'。

编辑:这是JaredPar解释的原因。如果你不想免费,不要使用这种方法。

+0

你把话说出我的嘴! – leppie 2009-02-03 18:06:58

+0

一定不要使用String。如果函数的返回值是一个字符串,则CLR将尝试CoTaskMemFree这个可能不是用户想要的原生指针 – JaredPar 2009-02-03 18:07:25

4

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

还请记住,C++中的字符是C#中的一个字节,并且无符号字符是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()); 
} 
相关问题