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