2010-10-17 17 views
5

Ich suche nach einem einfachen Beispielcode für C++ \ IronPython-Integration, d. H. Einbetten von Python-Code in einem C++ - oder noch besser, Visual C++ - Programm.C++ IronPython Integration Beispielcode?

Das Codebeispiel sollte folgendes beinhalten: wie Objekte zwischen den Sprachen zu teilen, wie Funktionen aufrufen \ Methoden hin und her etc ...

Auch eine explizite Setup-Prozedur würde auch helfen. (Wie man die Python-Laufzeitdll in Visual Studio einbindet usw.)

Ich habe ein schönes Beispiel für C# \ IronPython here gefunden, konnte aber C++ \ IronPython-Beispielcode nicht finden.

+0

Keine vollständige Antwort, aber wahrscheinlich wollen Sie entweder COM-Interop. Definieren Sie eine identische Schnittstelle sowohl in Ihrem C++ - Code als auch in einer C# -Klassenbibliothek. Stellen Sie sicher, dass diese Schnittstelle ein dünner Wrapper ist, den Sie in Bezug auf Bereiche, Engines, Ausführungscode und die ObjectOperations-Klasse benötigen. Sie müssen natürlich die Lebensdauerverwaltung der Objekte auf der C++ - Seite durchführen.Sie können die CLR entweder hosten oder die .NET-Assembly direkt als COM-Objekt registrieren. Dann erstellen Sie es einfach von der C++ Seite und jetzt können Sie mit IronPython sprechen. –

Antwort

2

UPDATE - ich habe ein allgemeineres Beispiel (plus ein Link zu einer ZIP-Datei das gesamte VS2008 Projekt enthält) geschrieben als Eintrag auf meinem Blog here.

Sorry, ich bin so spät, um das Spiel, aber hier So habe ich IronPython in Visual Studio 2008 - .net 3.5 in eine C++/cli-App integriert. (eigentlich Mixed-Mode-App mit C/C++)

Ich schreibe Add-ons für eine Map Making-Anwendung geschrieben in Assembly. Die API ist verfügbar, sodass C/C++ - Add-Ons geschrieben werden können. Ich mische C/C++ mit C++/cli. Einige der Elemente aus diesem Beispiel sind von der API (wie xpcall und CmdEnd() - bitte einfach ignorieren)

/////////////////////////////////////////////////////////////////////// 
void XPCALL PythonCmd2(int Result, int Result1, int Result2) 
{ 
    if(Result==X_OK) 
    { 
     try 
     { 
       String^ filename = gcnew String(txtFileName); 
       String^ path = Assembly::GetExecutingAssembly()->Location; 
       ScriptEngine^ engine = Python::CreateEngine(); 
       ScriptScope^ scope = engine->CreateScope(); 
       ScriptSource^ source = engine->CreateScriptSourceFromFile(String::Concat(Path::GetDirectoryName(path), "\\scripts\\", filename + ".py")); 

       scope->SetVariable("DrawingList", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingList::typeid)); 
       scope->SetVariable("DrawingElement", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingElement::typeid)); 
       scope->SetVariable("DrawingPath", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingPath::typeid)); 
       scope->SetVariable("Node", DynamicHelpers::GetPythonTypeFromType(AddIn::Node::typeid)); 

       source->Execute(scope); 
     } 
     catch(Exception ^e) 
     { 
       Console::WriteLine(e->ToString()); 
       CmdEnd(); 
     } 
    } 
    else 
    { 
     CmdEnd(); 
    } 
} 
/////////////////////////////////////////////////////////////////////////////// 

Wie Sie sehen können, ich Ironpython aussetzen einige Objekte (DrawingList, DrawingElement, DrawingPath & Knoten). Diese Objekte sind C++/CLI-Objekte, die ich erstellt habe, um "Dinge" für IronPython verfügbar zu machen.

Wenn die Zeile C++/cli source-> Execute (scope) aufgerufen wird, ist die einzige auszuführende Python-Zeile die DrawingList.RequestData.

RequestData verwendet einen Delegaten und einen Datentyp.

Wenn der C++/cli Code ausgeführt wird, ruft er die Delegierten auf die sie ruft die angeforderten Daten mit dem Aufruf von DrawingList.RequestedValue

In der Funktion Diamant Funktion „Diamant“ zeigt() Der Aufruf to DrawingList.AddElement (dp) fügt das neue Element der visuellen Datenbank von Applications hinzu.

Und schließlich der Aufruf von DrawingList.EndCommand() sagt der FastCAD-Engine zu bereinigen und beenden Sie die Ausführung des Plugins.

import clr 
def diamond(Result1, Result2, Result3): 

    if(Result1 == 0): 

    dp = DrawingPath() 
    dp.drawingStuff.EntityColor = 2 
    dp.drawingStuff.SecondEntityColor = 2 

    n = DrawingList.RequestedValue() 

    dp.Nodes.Add(Node(n.X-50,n.Y+25)) 
    dp.Nodes.Add(Node(n.X-25,n.Y+50)) 
    dp.Nodes.Add(Node(n.X+25,n.Y+50)) 
    dp.Nodes.Add(Node(n.X+50,n.Y+25)) 
    dp.Nodes.Add(Node(n.X,n.Y-40)) 

    DrawingList.AddElement(dp) 

    DrawingList.EndCommand() 

DrawingList.RequestData(diamond, DrawingList.RequestType.PointType) 

Ich hoffe, das ist, was Sie gesucht haben.

+0

Nicht sicher über die Etikette hier. Ich ging nach Hause und baute ein eigenständiges Beispiel. Ich fügte dann einen Blog-Eintrag (http://oldschooldotnet.blogspot.com/2011/04/scripting-ccli-with-ironpython-visual.html) hinzu - plus einen Link zu der zip-Datei, die das gesamte VS2008-Projekt enthält. Ich platziere einen Link an der Spitze des Posts, aber hätte/hätte ich die Antwort neu schreiben sollen, nachdem ich ein besseres Beispiel habe? – saunderl