pinvoking本机c ++函数给出堆栈溢出错误

时间:2013-12-19 17:24:32

标签: c# pinvoke

我在本机C ++文件中有一个函数定义,如下所示:

void fun(byte* arg1, int* arg2, byte arg3) {}

所以,从我的C#文件中,我按如下方式调用该函数:

fun(ref byte[] arg1, ref int arg2, byte arg3);

不应该用这个来解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我建议:

fun([MarshalAs(UnmanagedType.LPArray)] byte[] arg1, ref int arg2, byte arg3)

See MarshalAsUnmanagedType

您拥有的ref byte[] arg1对应于C ++ byte **

答案 1 :(得分:1)

byte[]编组为指向数组第一个元素的指针。这正是您在非托管方面所需要的。您使用了ref byte[],它具有额外的,虚假的间接级别。所以你的代码可以简单地是:

[DllImport(...)]
fun(byte[] arg1, ref int arg2, byte arg3);

marshaller通过固定来处理字节数组,因此参数将输入/输出。虽然我怀疑你实际上只会将数据从托管传递到非托管。但是,如果您的非托管代码修改了数组,那么这些修改实际上将直接发送到固定托管数组。

答案 2 :(得分:0)

第一个参数是指向单个字节对象的指针,该指针将转换为

public static extern void fun(ref byte arg1, ref int arg2, byte arg3);

如果你想说它是一个数组,我会使用IntPtr

public static extern  void fun(ref IntPtr arg1, ref int arg2, byte arg3);

我发现PInvoke Interop Assitant对于这种东西非常有用。另请参阅pinvoke.net以了解如何使用大量标准DLL导入。