Python脚本调用C#代码数据交互示例(hello world)

原地址:

http://www.djangochina.cn/forum.php?mod=viewthread&tid=247

 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这里为IronPython脚本感兴趣但不入门的朋友写几篇使用心得,这是第一个:最简单的hello world程序。
        首先,我们必须有一个IronPython脚本引擎库(IronPython.dll),我用的版本是V1.0,你可以在网上直接下到相关源码,编译后即生成IronPython.dll。
1、简单版本Hello World
        新建一个C#桌面程序,引用该库后,我们便开始编写第一个程序。
        下面是C#中的代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using IronPython.Hosting;
  9. namespace TestIronPython
  10. {
  11.    
  12.     public partial class Form1 : Form
  13.     {
  14.        public Form1()
  15.         {
  16.             InitializeComponent();        
  17.         }
  18.         
  19.         private void button1_Click(object sender, EventArgs e)
  20.         {
  21.             PythonEngine scriptEngine = new PythonEngine();
  22.             scriptEngine.Execute(textBox1.Text);
  23.         }
  24.     }
  25. }
复制代码

代码很简单,声明了一个scriptEngine 实例,直接用Execute执行代码即可。下面看看py的代码该怎么写:

  1. import clr
  2. clr.AddReferenceByPartialName("System.Windows.Forms")
  3. clr.AddReferenceByPartialName("System.Drawing")
  4. from System.Windows.Forms import *
  5. from System.Drawing import *
  6. MessageBox.Show("Hello World!")
复制代码

第一句代码很重要,导入.net clr,用clr的AddReferenceByPartialName方法加载我们熟悉的System.Windows.Forms和System.Drawing库,最后可以直接执行.net中的MessageBox方法。
     运行后,直接单击button1,即可弹出一个对话框"Hello World!"
    怎么样,是不是很简单?!

2、数据交互
单单执行脚本是没有什么意思的,最重要的是嵌入的脚本能和宿主语言进行交互,下面我就讲讲这方面的实现。
       IronPython脚本最优秀的地方就是与C#(或者说.net框架集)几乎无缝集成,C#实现的类很容易就传入到脚本中去。(目前唯感遗憾的是,IronPython脚本还没有支持嵌入版,希望不远的的将来能实现嵌入式版本)。
       这是宿主语言的代码:

  1. public partial class Form1 : Form
  2.     {
  3.         public Form1()
  4.         {
  5.             InitializeComponent();
  6.         }
  7.         private void button1_Click(object sender, EventArgs e)
  8.         {
  9.             PythonEngine scriptEngine = new PythonEngine();
  10.             TestData td = new TestData();
  11.             td.intNum = 10;
  12.             scriptEngine.DefaultModule.Globals["td"] = td;
  13.             scriptEngine.Execute(textBox1.Text);
  14.             //显示intNum是否被脚本识别并改变
  15.             MessageBox.Show(td.intNum.ToString());
  16.         }
  17.     }
  18.     //数据交互类
  19.     public class TestData
  20.     {
  21.         public int intNum = 0;
  22.     }
复制代码

上面最关键的代码就是:scriptEngine.DefaultModule.Globals["td"] = td;
    scriptEngine.DefaultModule这是一个字典类,可以添加多个不同类型,供脚本使用。字典中的关键字与脚本中对象的名称保持一致(内容任意,可以和你传的对象名称不一样,关键看你的意愿了)即可。
     脚本对类中的一个变量进行运算,然后把结果显示出来(如下图,对应脚本在文本框里)


怎么样,这个也很简单吧?下一篇文章,我就讲讲 IronPython脚本如何调用C#实现的dll库。

posted @ 2014-08-09 17:21  ing...  阅读(1800)  评论(0编辑  收藏  举报