Pregunta C # - ¿Cómo convertir Object a IntPtr y viceversa?


Quiero pasar un objeto del código administrado a una función de WinApi como IntPtr. Pasará este objeto a mi función de devolución de llamada en código administrado como IntPtr. No es una estructura, es una instancia de una clase.

¿Cómo puedo convertir object a IntPtr y de vuelta?


32
2018-06-27 09:48


origen


Respuestas:


Entonces, si quiero pasar una lista a mi función de devolución de llamada a través de WinApi, 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

Editar: Como se señaló en los comentarios, debe liberar el mango después de su uso. También utilicé el casting. Podría ser aconsejable usar los métodos estáticos GCHandle.ToIntPtr(handle1) y GCHandle.FromIntPtr(parameter) me gusta aquí. No he verificado eso.


45
2018-06-27 10:12