嵌套的 System.RuntimeType 对象自动更改地址

问题描述

我正在使用基于 .NET 4.5 的 pythonnet 加载类库 dll,可能是用 VB 编写的。我可以实例化最相关的类 (SDK),创建所需的对象作为方法参数并调用方法

import clr
clr.AddReference("C7000_SDK")
from C7000 import SDK
import System
sdk = SDK()
sdk.SK_Connect()

然而,有一种方法需要一个对象作为具有嵌套对象的参数。如果我创建对象,内部对象的地址会随着每次调用而变化。我不在乎,但问题是,我无法为这些嵌套对象的成员分配值/对象。

res = SDK.SKS_MEAS_RESULT()

res.ColorRenditionIndexes
Out[28]: <C7000.SKS_COLOR_RENDERING_INDEX object at 0x0C18D6A0>

res.ColorRenditionIndexes
Out[29]: <C7000.SKS_COLOR_RENDERING_INDEX object at 0x0C18D3B8>

我认为这个地址更改是主要问题。我实际上需要做的是为某些数组分配内存,如下所示:

# Works fine
res.SpectralData_1nm = System.Array[System.Single]([0.0]*SDK.SKF_WAVELENGTH_1NM_COUNT)
res.SpectralData_1nm
Out[31]: <System.Single[] object at 0x0C18D598>

# Doesn't work
res.ColorRenditionIndexes.Ri = System.Array[System.String]([""]*SDK.SKF_CRI_COUNT)
type(res.ColorRenditionIndexes.Ri)
Out[34]: nonetype

我用 C++/CLI 编写了一个包装器,在其中使用了以下内容,并且效果很好。

SDK::SKS_MEAS_RESULT res;
res.SpectralData_1nm = gcnew array<float>(SDK::SKF_WAVELENGTH_1NM_COUNT);
res.ColorRenditionIndexes.Ri = gcnew array<String^>(SDK::SKF_CRI_COUNT);

我不确定我在哪里遗漏了什么。感谢您的帮助。

解决方法

ref T 是值类型时,Python 无法表示 C# 的 T 类型。相反,当您访问 res.ColorRenditionIndexes 时,您会获得其值的副本。

解决方法是分 3 个步骤进行分配:

cri = res.ColorRenditionIndexes
cri.Ri = ...
res.ColorRenditionIndexes = cri