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