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

Nested System.RuntimeType object changes address automatically

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

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

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

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);

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

T 是值类型时,

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

解决方法是分 3 步分配:

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