C++\IronPython集成示例代码?

5
我正在寻找一个关于C++\IronPython集成的简单示例代码,即将Python代码嵌入到C++或更好的Visual C++程序中。
示例代码应包括:如何在两种语言之间共享对象,如何来回调用函数\方法等...
此外,明确的设置过程也会有所帮助。(如何在Visual Studio中包含Python运行时dll等...)
我已经找到了一个很好的C#\IronPython示例(这里),但是找不到C++\IronPython示例代码。

不是完整的答案,但你可能想要使用COM互操作。在你的C++代码和C#类库中定义一个相同的接口。让该接口作为一个薄包装器,围绕着你需要的范围、引擎、执行代码和ObjectOperations类进行。当然,你需要在C++端对对象进行生命周期管理。你可以托管CLR或直接将.NET程序集注册为COM对象。然后你只需从C++端创建它,现在你就可以与IronPython通信了。 - Dino Viehland
2个回答

2

更新 - 我在我的博客上写了一个更通用的例子(以及一个链接,包含整个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)

我希望这正是你要寻找的内容。

不确定这里的礼仪。我回家建立了一个独立的示例。然后我添加了一篇博客文章(http://oldschooldotnet.blogspot.com/2011/04/scripting-ccli-with-ironpython-visual.html) - 还有一个链接到包含整个VS2008项目的zip文件。我将在帖子顶部放置一个链接,但是现在我有了更好的示例,我是否应该重新编写答案? - saunderl

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接