我正在尝试将指向UInt16数组的指针发送到编组函数,就像在C#中一样:
C ++:
int foo(Unsigned_16_Type** Buffer_Pointer);
C#:
[DllImport("example.dll")]
public static extern int foo(IntPtr Buffer_Pointer);
UInt16[] bufferArray = new UInt16[32];
IntPtr p_Buffer = (IntPtr)Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(UInt16)) * bufferArray.Length);
Marshal.Copy(bufferArray, 0, p_Buffer, bufferArray.Length); //Issue is here
GCHandle handle = GCHandle.Alloc(p_Buffer, GCHandleType.Pinned);
IntPtr ppUnmanagedBuffer = (IntPtr)handle.AddrOfPinnedObject();
UInt16 word_count = 0;
this.lstbox_DATA_WORDS.Items.Clear();
if ( foo(ppUnmanagedBuffer );
我的主要问题是Marshal.Copy
,对于第一个参数是源数组,它不需要UInt16[]
。我想知道是否有人知道如何将Marshal.Copy
与UInt16
数组一起使用。
答案 0 :(得分:1)
没有Marshal.Copy
重载采用无符号短数组。幸运的是,ushort
和short
大小相同,因此您可以使用Marshal.Copy(Int16[], IntPtr, int)
重载。您只需先将ushort[]
强制转换为short[]
。
执行此操作的最快方法可能是使用Buffer.BlockCopy
。它复制字节,所以你只需要告诉它每个条目复制2个字节:
short[] temp = new short[bufferArray.Length];
System.Buffer.BlockCopy(bufferArray, 0, temp, 0, temp.Length * 2);
这会将无符号的16位整数值复制到带符号的16位整数数组中,但基础字节值将保持不变,非托管代码将不会知道差异。