我在本机C ++文件中有一个函数定义,如下所示:
void fun(byte* arg1, int* arg2, byte arg3) {}
所以,从我的C#文件中,我按如下方式调用该函数:
fun(ref byte[] arg1, ref int arg2, byte arg3);
不应该用这个来解决这个问题吗?
答案 0 :(得分:2)
我建议:
fun([MarshalAs(UnmanagedType.LPArray)] byte[] arg1, ref int arg2, byte arg3)
您拥有的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导入。