You need to enable JavaScript to run this app. Pythonnet调用.NET类库时嵌套System.RuntimeType对象地址自动变更无法赋值
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 11:15:03