2010-10-17 13 views
5

Estoy buscando un código de ejemplo simple código de ejemplo integración C++ \ IronPython, es decir, incrustando código python dentro de un programa C++, o mejor aún, Visual C++.Código de ejemplo de integración de C++ IronPython?

El código de ejemplo debe incluir: cómo compartir objetos entre los idiomas, la forma de llamar a las funciones \ métodos de ida y vuelta, etc ...

Además, un procedimiento de configuración explícita ayudaría también. (Cómo incluir el dll runtime dll en Visual Studio, etc.)

He encontrado un buen ejemplo para C# \ IronPython here, pero no he podido encontrar el código de ejemplo C++ \ IronPython.

+0

No es una respuesta completa, pero probablemente desee interoperar con COM. Defina una interfaz idéntica tanto en su código C++ como en una biblioteca de clases C#. Haga que esa interfaz sea una capa delgada de lo que necesita con respecto a los ámbitos, motores, código de ejecución y la clase ObjectOperations. Tendrá que hacer una gestión de por vida de los objetos en el lado de C++, por supuesto.Puede alojar el CLR o registrar el ensamblado .NET como un objeto COM directamente. Entonces simplemente lo creas en CoCreate desde el lado de C++ y ahora puedes hablar con IronPython. –

Respuesta

2

ACTUALIZACIÓN - He escrito un ejemplo más genérico (además de un enlace a un archivo zip que contiene todo el proyecto VS2008) como la entrada en mi blog here.

En este momento, estoy tan tarde al juego, pero aquí es cómo he integrado IronPython en una aplicación C++/cli en Visual Studio 2008 - .net 3.5. (en realidad, la aplicación de modo mixto con C/C++)

Escribo complementos para un mapa que hace la solicitud escrita en Asamblea. La API está expuesta para que se puedan escribir complementos C/C++. Yo mezclo C/C++ con C++/cli. Algunos de los elementos de este ejemplo son de la API (como xpcall y CmdEnd() - por favor, simplemente ignorarlos)

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

Como se puede ver, expongo a IronPython algunos objetos (DrawingList, DrawingElement, DrawingPath & Nodo). Estos objetos son objetos C++/cli que he creado para exponer "cosas" a IronPython.

Cuando se llama a la línea C++/cli source-> Execute (scope), la única línea de python que se ejecutará es DrawingList.RequestData.

RequestData toma un delegado y un tipo de datos.

Cuando se hace el código ++/CLI C, llama al delegado que apunta a la función "diamante"

En el diamante función que recupera los datos solicitados con la llamada a DrawingList.RequestedValue() La llamada a DrawingList.AddElement (dp) agrega el nuevo elemento a la base de datos visual de aplicaciones.

Y, por último, la llamada a DrawingList.EndCommand() le dice al motor de FastCAD limpiar y finalizar el funcionamiento del complemento.

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) 

Espero que esto sea lo que estaba buscando.

+0

No estoy seguro de la etiqueta aquí. Fui a casa y construí un ejemplo independiente. Luego agregué una entrada de blog (http://oldschooldotnet.blogspot.com/2011/04/scripting-ccli-with-ironpython-visual.html) al respecto, más un enlace al archivo zip que contiene todo el proyecto VS2008. Estoy colocando un enlace en la parte superior de la publicación, pero ¿debería/debería haber vuelto a escribir la respuesta ahora que tengo un mejor ejemplo? – saunderl

Cuestiones relacionadas