2010-10-17 16 views
5

Sto cercando un semplice codice di esempio per integrazione C++ \ IronPython, ovvero incorporare il codice Python all'interno di un C++, o meglio ancora, programma Visual C++.Codice di esempio di integrazione C++ IronPython?

Il codice di esempio dovrebbe includere: come condividere oggetti tra i linguaggi, come chiamare funzioni \ metodi avanti e indietro, ecc ...

Inoltre, una procedura di configurazione esplicita aiuterebbe troppo. (Come includere la DLL di runtime di Python in Visual Studio ecc ...)

Ho trovato un buon esempio per C# \ IronPython here, ma non sono riuscito a trovare codice di esempio C++ \ IronPython.

+0

Non è una risposta completa, ma probabilmente si desidera interoperabilità COM. Definire un'interfaccia identica sia nel codice C++ che in una libreria di classi C#. Avere questa interfaccia è un involucro sottile attorno a ciò che è necessario per quanto riguarda gli ambiti, i motori, il codice di esecuzione e la classe ObjectOperations. Dovrai ovviamente gestire in modo permanente gli oggetti sul lato C++.È possibile ospitare il CLR o registrare direttamente l'assembly .NET come oggetto COM. Quindi devi solo crearlo dal lato C++ e ora puoi parlare con IronPython. –

risposta

2

UPDATE - ho scritto un esempio più generica (più un collegamento ad un file zip contenente l'intero progetto VS2008) come l'ingresso sul mio blog here.

dispiace, io sono così in ritardo al gioco, ma qui è come ho integrato IronPython in un'applicazione C++/cli in Visual Studio 2008 - .net 3.5. (in realtà l'app in modalità mista con C/C++)

Scrivo componenti aggiuntivi per un'applicazione di creazione di mappe scritta in Assembly. L'API è esposta in modo che i componenti aggiuntivi C/C++ possano essere scritti. Mescolo C/C++ con C++/cli. Alcuni degli elementi di questo esempio sono da API (come XPCALL e CmdEnd() - per favore ignorarli)

/////////////////////////////////////////////////////////////////////// 
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(); 
    } 
} 
/////////////////////////////////////////////////////////////////////////////// 

Come potete vedere, mi espongo a IronPython alcuni oggetti (DrawingList, DrawingElement, DrawingPath & Nodo). Questi oggetti sono oggetti C++/cli che ho creato per esporre "cose" a IronPython.

Quando viene chiamata la riga C++/cli source-> Execute (scope), l'unica linea python da eseguire è DrawingList.RequestData.

RequestData accetta un delegato e un tipo di dati.

Quando il codice ++/CLI C è fatto, si chiama il delegato che punta alla funzione di "diamante"

nel diamante funzione recupera i dati richiesti con la chiamata a DrawingList.RequestedValue() La chiamata a DrawingList.AddElement (dp) aggiunge il nuovo elemento al Database visivo Applicazioni.

Infine, la chiamata a DrawingList.EndCommand() indica al motore FastCAD di di pulire e terminare l'esecuzione del plug-in.

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) 

Spero che questo sia quello che stavi cercando.

+0

Non sicuro dell'etichetta qui. Sono andato a casa e ho costruito un esempio indipendente. Ho quindi aggiunto un post di blog (http://oldschooldotnet.blogspot.com/2011/04/scripting-ccli-with-ironpython-visual.html) a questo proposito, oltre a un collegamento al file zip contenente l'intero progetto VS2008. Sto posizionando un link nella parte superiore del post, ma/avrei dovuto riscrivere la risposta ora che ho un esempio migliore? – saunderl

Problemi correlati