此列表是否正确?
unsigned int(c) -> uint(c#) const char*(c) -> String(c#) unsigned int*(c) -> uint[](c#) unsigned char*(c) -> byte[](c#)
我认为这里有一个错误,因为本机函数的这4个参数我有PInvokeStackImbalance。
C函数是:
bool something
(unsigned char *a,
unsigned int a_length,
unsigned char *b,
unsigned int *b_length);
PInvoke是:
[DllImport(@"lib.dll", EntryPoint = "something")]<br>
public static extern bool something(
byte[] a,
uint a_length,
byte[] b,
uint[] b_length);
答案 0 :(得分:2)
首先,PInvoke.net是你的朋友。
其次,您的转换是正确的,但您应该使用StringBuilder
作为以char*
作为缓冲区来填充([in out]
)的函数。
您的堆栈不平衡可能是由于使用了不同的调用约定。 C#的默认调用约定是__stdcall
,但您的C函数可能是__cdecl
。如果是这种情况,您需要将CallingConvention添加到DLLImport
属性。
unsigned int
的指针(例如,与期望int
的数组相反)那么你应该使用ref uint
代替int[]
。