• 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库。

  • 相关阅读:
    ssh scp命令详解
    python模块与包
    python参数Sample Code
    python 多线程简介
    python virtualenv环境安装(ubuntu)
    python pip 代理设置
    mysql资源总结
    mysql索引原理及用法
    Oracle学习笔记:利用user_segments查表的大小
    Oracle学习笔记:dba_tables、all_tables、user_tables区别
  • 原文地址:https://www.cnblogs.com/123ing/p/3901347.html
Copyright © 2020-2023  润新知