我怎样才能在一个指针传递给一个UINT16数组的指针编组功能?(How can I pass in

2019-10-18 09:26发布

我试图指针发送到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.CopyUInt16阵列。

Answer 1:

没有Marshal.Copy过载,其采用无符号短数组。 幸运的是, ushortshort的大小相同,所以你可以使用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位整数数组,但潜在字节值将保持不变,并在非托管代码不会知道其中的差别。



文章来源: How can I pass in a pointer to a pointer of a UInt16 array to a Marshalled function?