1

C# のように、UInt16 配列のポインターへのポインターをマーシャリングされた関数に送信しようとしています。

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.Copyunsigned short 配列を取るオーバーロードはありません。幸い、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 に答える