我开始使用C ++ / CLI结合IronPython :) 我在Python代码中遇到了托管结构的问题。 我的结构看起来像这样
[System::Runtime::InteropServices::StructLayout(
System::Runtime::InteropServices::LayoutKind::Sequential)]
public value struct VersionInfo
{
[System::Runtime::InteropServices::MarshalAsAttribute(
System::Runtime::InteropServices::UnmanagedType::U4)]
DWORD Major;
};
将此结构传递给Python如下
VersionInfo^ vi = gcnew VersionInfo();
vi->Major = 12345;
IronPython::Runtime::PythonFunction^ function =
(IronPython::Runtime::PythonFunction^)
m_PluginScope->GetVariable("GetGlobalInfo");
array<VersionInfo^>^ args = gcnew array<VersionInfo^>(1)
{
vi
};
auto result = m_Engine->Operations->Invoke(function, args);
最后,Python代码:
def GetGlobalInfo(info):
info.Major = 55
return info.Major
结果中的返回值不是 55,如预期,但是12345。 任何人都可以帮我找出,为什么价值不会改变Python代码? 感谢
答案 0 :(得分:2)
我不知道这是否是您问题的原因,但是:
public value struct VersionInfo
VS
VersionInfo^ vi
array<VersionInfo^>^
这两件事情有冲突:C ++ / CLI中的value struct
定义了一个值类型,而不是一个引用类型,所以你不想在它上面使用^
。在C ++ / CLI中定义一个类似的变量是 legal ,但它非常非标准,你甚至不能在C#中拥有这样的变量。
在没有^
的情况下试一试,看看你的结果是什么。但是要小心,因为现在将vi
插入到数组中将会复制vi
,这将被独立修改。
或者,您可以将VersionInfo
更改为public ref class
,然后其余代码正确无误。标准。