更新 - 我在我的博客上写了一个更通用的例子(以及一个链接,包含整个VS2008项目的zip文件),请点击这里.
抱歉,我来晚了,但是我会告诉你如何将IronPython集成到Visual Studio 2008 - .net 3.5的C++/cli应用程序中(实际上是混合模式应用程序,包括C/C++)。
我为一个使用Assembly编写的地图制作应用程序编写插件。该API已经暴露出来,因此可以编写C/C++插件。我将C/C++与C++/cli混合使用。 这个例子中的一些元素来自API(例如XPCALL和CmdEnd() - 请忽略它们)。
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();
}
}
正如您所看到的,我向IronPython公开了一些对象(DrawingList、DrawingElement、DrawingPath和Node)。这些对象是我创建的C++/cli对象,用于向IronPython公开“东西”。
当调用C++/cli source->Execute(scope)行时,唯一要运行的python行是DrawingList.RequestData。
RequestData需要一个委托和一个数据类型。
当C++/cli代码完成时,它调用指向函数“diamond”的委托。
在diamond函数中,它使用对DrawingList.RequestedValue()的调用检索请求的数据。对DrawingList.AddElement(dp)的调用将新元素添加到应用程序的可视数据库中。
最后,对DrawingList.EndCommand()的调用告诉FastCAD引擎清理并结束插件的运行。
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)
我希望这正是你要寻找的内容。