2013-07-19 3 views
1

Je tente d'envoyer un pointeur vers un pointeur d'un tableau UInt16 à une fonction marshalé comme tant en C#:Comment puis-je passer un pointeur vers un pointeur d'un tableau UInt16 à une fonction Marshalled?

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); 

Mon principal problème est avec le Marshal.Copy, pour le premier argument qui est le tableau source, il ne prend pas un UInt16[]. Je me demandais si quelqu'un savait comment utiliser Marshal.Copy avec un tableau UInt16.

Répondre

1

Il n'y a pas de surcharge Marshal.Copy qui prend une courte série non signée. Heureusement, ushort et short ont la même taille, donc vous pouvez utiliser la surcharge Marshal.Copy(Int16[], IntPtr, int). Vous avez juste besoin de contraindre votre ushort[] dans un short[] en premier.

Probablement le moyen le plus rapide de le faire est d'utiliser Buffer.BlockCopy. Il copie octets, il vous suffit de le dire pour copier 2 octets par entrée:

short[] temp = new short[bufferArray.Length]; 
System.Buffer.BlockCopy(bufferArray, 0, temp, 0, temp.Length * 2); 

Cela copiera les valeurs entières 16 bits non signé dans un tableau signé entier 16 bits, mais les valeurs d'octets sous-jacent rester le même, et le code non géré ne connaîtra pas la différence.

+0

System.Buffer.BlockCopy (bufferArray, 0, temp, 0, temp.Length * 2]; Devrait avoir un) à la fin pas], mais autrement fonctionne très bien merci! – user2134127

Questions connexes