2017-05-19 45 views
0

我開始將C++/CLI與IronPython結合起來:) 我遇到了Python代碼中託管結構的問題。 我的結構看起來像這樣將C++/CLI結構傳遞給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; 
}; 

傳遞這個結構,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. Can any正文請幫我弄清楚,爲什麼Python的代碼沒有改變這個值? 感謝

回答

2

我不知道這是不是你的問題的原因,但:

public value struct VersionInfo 

VS

VersionInfo^ vi 
array<VersionInfo^>^ 

這兩件事情有衝突:在C++/CLI定義value struct值類型,而不是引用類型,所以您不想在其上使用^。它是合法的來定義類似於C++/CLI中的變量,但它非常不標準,甚至連C#中都沒有這樣的變量。

試一下沒有^,看看你的結果是什麼。但是,要小心,因爲現在將vi插入到陣列中會使vi的副本變得獨立。

或者,您可以將VersionInfo更改爲public ref class,然後您的其他代碼是正確的&標準。

+0

謝謝。我在結構定義中用_ref_取代_value_,現在它正在工作。 –