将C ++ / CLI结构传递给IronPython PythonFunction

时间:2017-05-19 12:49:23

标签: python c++-cli ironpython

我开始使用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代码? 感谢

1 个答案:

答案 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,然后其余代码正确无误。标准。