如何在Python 3.10中访问System.Reflection.Pointer指向的float数组?
在Python中访问System.Reflection.Pointer指向的float数组
核心解决思路
通过C#互操作工具类将指针转换为IntPtr,再借助Python的ctypes库解析内存地址中的float数据。
具体操作步骤
将System.Reflection.Pointer转为IntPtr
使用System.Runtime.InteropServices.Marshal类的GetIntPtr方法,把Pointer实例转换为底层指针的标准表示:import clr from System.Runtime.InteropServices import Marshal # ptr为你从C#函数获取的System.Reflection.Pointer对象 int_ptr = Marshal.GetIntPtr(ptr)用ctypes解析内存为float数组
借助ctypes将IntPtr对应的内存区域映射为可直接访问的float数组,需要提前知晓数组长度(若C#未返回长度,需调用对应接口获取):import ctypes # 替换为实际的数组长度 array_len = 10 # 从内存地址生成float数组 float_array = (ctypes.c_float * array_len).from_address(int_ptr.ToInt64()) # 直接访问数组元素 print(float_array[0]) # 转为Python列表方便后续操作 py_float_list = list(float_array)内存管理注意事项
- 若数组内存是C#托管内存,PythonNet会自动处理回收,无需手动操作;
- 若为非托管内存,需调用
Marshal.FreeHGlobal(int_ptr)释放,避免内存泄漏。
补充说明
Unbox()方法仅适用于装箱的单个值类型,不适用于指针指向的数组,因此无法通过该方法获取目标数据。
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

