我想将对象从托管代码传递给IntPtr到WinApi函数。它将把该对象作为IntPtr传递回托管代码中的回调函数。它不是结构,而是类的实例。

如何将object转换为IntPtr并返回?

最佳答案

因此,如果我想通过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");

Thx到David Heffernan

编辑:如注释中所述,使用后需要释放手柄。我也用铸件。使用静态方法GCHandle.ToIntPtr(handle1)GCHandle.FromIntPtr(parameter)(如here)可能是明智的。我还没有验证。

关于c# - C#-如何将对象转换为IntPtr并返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17339928/

10-12 19:17