且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C# - 如何将对象转换为 IntPtr 并返回?

更新时间:2023-02-14 21:32:12

所以如果我想通过 WinApi 将列表传递给我的回调函数,我使用 GCHandle

So if I want to pass a list to my callback function through WinApi I use 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");

感谢大卫·赫弗南

如评论中所述,您需要在使用后释放手柄.我也使用了铸造.使用静态方法 GCHandle.ToIntPtr(handle1)GCHandle.FromIntPtr(parameter)这里.我还没有验证过.

As noted in the comments, you need to free the handle after use. Also I used casting. It might be wise to use the static methods GCHandle.ToIntPtr(handle1) and GCHandle.FromIntPtr(parameter) like here. I haven't verified that.