2017-05-19 4 views
0

Ich beginne mit C++/CLI kombiniert mit IronPython :) Ich stieß auf Problem mit verwalteten Strukturen in Python-Code. Meine Struktur sieht wie folgt ausÜbergabe von C++/CLI-Struktur an IronPython PythonFunction

[System::Runtime::InteropServices::StructLayout(
    System::Runtime::InteropServices::LayoutKind::Sequential)] 
public value struct VersionInfo 
{ 
    [System::Runtime::InteropServices::MarshalAsAttribute(
     System::Runtime::InteropServices::UnmanagedType::U4)] 
    DWORD Major; 
}; 

Passing diese Struktur zu Python ist wie folgt

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

Und schließlich, den Python-Code:

def GetGlobalInfo(info): 
    info.Major = 55 
    return info.Major 

Der Rückgabewert in Ergebnis ist nicht 55 wie erwartet, aber 12345. Can any Körper bitte helfen Sie mir herauszufinden, warum der Wert nicht von Python-Code geändert wird? Dank

Antwort

2

Ich weiß nicht, ob dies die Ursache des Problems ist, aber:

public value struct VersionInfo 

vs

VersionInfo^ vi 
array<VersionInfo^>^ 

Diese beiden Dinge sind in Konflikt: value struct in C++/CLI definiert ein Werttyp, kein Referenztyp, so dass Sie nicht ^ darauf verwenden möchten. Es ist legal eine Variable wie die in C++/CLI zu definieren, aber es ist sehr nicht-Standard, und Sie können nicht einmal eine solche Variable in C# haben.

Versuchen Sie es ohne die ^, und sehen Sie, was Ihr Ergebnis ist. Seien Sie jedoch vorsichtig, denn wenn Sie jetzt vi in das Array einfügen, wird ein Duplikat von vi erstellt, das unabhängig modifiziert werden würde.

Alternativ können Sie VersionInfo zu public ref class ändern, und dann ist der Rest Ihres Codes korrekt & Standard.

+0

Danke. Ich habe _value_ durch _ref_ in der Strukturdefinition ersetzt und es funktioniert jetzt. –

Verwandte Themen