c - >从dll使用本机函数时的c#数据类型转换

时间:2011-06-08 07:22:14

标签: c# types pinvoke

此列表是否正确?

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);

1 个答案:

答案 0 :(得分:2)

首先,PInvoke.net是你的朋友。

其次,您的转换是正确的,但您应该使用StringBuilder作为以char*作为缓冲区来填充([in out])的函数。

您的堆栈不平衡可能是由于使用了不同的调用约定。 C#的默认调用约定是__stdcall,但您的C函数可能是__cdecl。如果是这种情况,您需要将CallingConvention添加到DLLImport属性。

编辑:另外,正如Groo指出的那样,如果C函数中的指针参数实际上只是指向unsigned int的指针(例如,与期望int的数组相反)那么你应该使用ref uint代替int[]