2013-06-27 12 views
30

Voglio passare un oggetto dal codice gestito a una funzione WinApi come IntPtr. Restituirà questo oggetto alla funzione di richiamata nel codice gestito come IntPtr. Non è una struttura, è un'istanza di una classe.C# - Come convertire oggetti in IntPtr e Back?

Come si converte object in IntPtr e viceversa?

+2

Pin utilizzando GCHandle –

risposta

42

Quindi, se voglio passare un elenco per la mia funzione di callback attraverso Winapi Io uso GCHandle

// object to IntPtr (before calling WinApi): 
List<string> list1 = new List<string>(); 
GCHandle handle1 = GCHandle.Alloc(list1); 
IntPtr parameter = (IntPtr) handle1; 
// call WinAPi and pass the parameter here 
// then free the handle when not needed: 
handle1.Free(); 

// back to object (in callback function): 
GCHandle handle2 = (GCHandle) parameter; 
List<string> list2 = (handle2.Target as List<string>); 
list2.Add("hello world"); 

Thx a David Heffernan

Edit: Come notato nei commenti, è necessario liberare la maniglia dopo l'uso. Inoltre ho usato il casting. Potrebbe essere opportuno utilizzare i metododici statici GCHandle.ToIntPtr(handle1) e GCHandle.FromIntPtr(parameter) come here. Non l'ho verificato

+1

L'handle deve essere [liberato] (https://msdn.microsoft.com/en-us/library/a95009h1 (v = vs.110) .aspx) quando non è più necessario! Questo codice perde –

+0

@dario_ramos Ha senso. Ho aggiunto una nota. – Bitterblue