Pythonnet调用.NET类库时嵌套System.RuntimeType对象地址自动变更无法赋值
pythonnet嵌套对象赋值失效解决方案
问题根本原因
你遇到的访问嵌套对象内存地址反复变动、嵌套成员赋值不生效的问题,本质是值类型结构体(VB中的Structure)和pythonnet的交互机制导致:
SKS_MEAS_RESULT是值类型而非引用类型,你每次通过res.ColorRenditionIndexes访问嵌套成员时,pythonnet都会返回该值类型成员的装箱拷贝对象,你看到的内存地址变动就是每次生成了新临时对象的表现。你给这个临时对象的Ri属性赋值,并不会写入原res对象的对应成员,所以二次读取时会返回None。
你之前顶层成员赋值正常,是因为直接修改的是res本身的成员,没有跨值类型嵌套层级,所以可以生效。
解决方法
不要直接链式访问嵌套成员赋值,单独取出嵌套结构体实例修改完成后,整体赋值回上层对象即可:
import clr clr.AddReference("C7000_SDK") from C7000 import SDK import System res = SDK.SKS_MEAS_RESULT() # 顶层成员赋值逻辑不变 res.SpectralData_1nm = System.Array[System.Single]([0.0]*SDK.SKF_WAVELENGTH_1NM_COUNT) # 嵌套成员单独处理 # 1. 单独实例化嵌套的结构体对象 cri_obj = SDK.SKS_COLOR_RENDERING_INDEX() # 2. 给单独的实例赋值 cri_obj.Ri = System.Array[System.String]([""]*SDK.SKF_CRI_COUNT) # 3. 将修改完成的实例整体赋值回上层对象 res.ColorRenditionIndexes = cri_obj
注意事项
- 如果存在多层嵌套的结构体,每一层都需要按照这个逻辑单独取出修改后再赋值回上层,不能直接链式赋值
- 该方案完全匹配你C++/CLI的代码逻辑,只是适配了pythonnet的值类型交互规则
内容的提问来源于stack exchange,提问作者Lothar
相关产品推荐
相关产品推荐

