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

Passing C++/CLI structure to IronPython PythonFunction

我开始使用 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

结果中的return值不是预期的55,而是12345。 谁能帮我找出为什么 Python 代码的值没有改变? 谢谢

我不知道这是否是您问题的原因,但是:

public value struct VersionInfo

VersionInfo^ vi
array<VersionInfo^>^

这两个东西有冲突:value struct在C++/CLI中定义的是值类型,不是引用类型,所以你不想在上面使用^。在 C++/CLI 中定义这样的变量是 合法的 ,但它非常不标准,你甚至不能在 C# 中拥有这样的变量。

在没有 ^ 的情况下尝试一下,看看结果如何。不过要小心,因为现在将 vi 插入到数组中会复制 vi,它会被单独修改。

或者,您可以将 VersionInfo 更改为 public ref class,然后您的其余代码将是正确且标准的。