Подтвердить что ты не робот

С# - Как преобразовать объект в IntPtr и обратно?

Я хочу передать объект из управляемого кода в функцию WinApi как IntPtr. Он вернет этот объект обратно в мою функцию обратного вызова в управляемом коде как IntPtr. Это не структура, это экземпляр класса.

Как преобразовать object в IntPtr и обратно?

4b9b3361

Ответ 1

Итак, если я хочу передать список моей функции обратного вызова через WinApi, я использую 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");

спасибо to Дэвид Хеффернан

Изменить: Как отмечено в комментариях, вам необходимо освободить дескриптор после использования. Также я использовал кастинг. Было бы разумно использовать статические методы GCHandle.ToIntPtr(handle1) и GCHandle.FromIntPtr(parameter) как здесь. Я не проверял это.