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.
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. –