1

我正在尝试将指向 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

4

1 回答 1

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 位整数数组中,但底层字节值将保持不变,并且非托管代码不会知道其中的区别。

于 2013-07-19T14:14:43.753 回答