将 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
,然后您的其余代码将是正确且标准的。
我开始使用 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
,然后您的其余代码将是正确且标准的。