动态类型语言(以下简称:"动态语言"),在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发 人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起,动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使 用动态语言来实现,其中,国内比较优秀的作品有“豆瓣”。微软更是不甘落后,建立了DLR(动态语言运行时)来吸引动态语言爱好者在其上实现动态语言。IronPython就是其主要成员之一。

在本系列文章中,我们将逐步实现一个自定义控件,实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【返回目录】

在上一节中,我们建立了IronPython运行环境,并且在其中成功的运行了“print "hello world"”的命令。正如上一节的讨论中所看到的,大家都很关心如何让IronPython脚本和我们的运行环境交互。在这一节中,我们将会在DLConsole上添加两个方法,实现将运行环境中的Clr对象传递给IronPython脚本使用。

大家可以从这里下载可运行的源代码。

1. 先看运行效果。

我在DLConsole中输入如下脚本:

1

importclr2clr.AddReference("System.Drawing")3clr.AddReference("System.Windows.Forms")45fromSystem.DrawingimportColor6fromSystem.Windows.FormsimportFlatStyle78Button1.BackColor=Color.Red;9Button1.FlatStyle=FlatStyle.Flat10Button1.Text="Hello IronPython"

运行结果,如图:

2. 确保脚本可以访问CLR对象

首先,我们需要脚本能够成功的访问CLR对象。我在DLConsole上暴露了两个方法。分别是:

1

publicpartialclassDLConsole : UserControl2

{3publicvoidRegistor(objectobj,stringname)4

{5this._scope.SetVariable(name, obj);6 }7publicvoidUnRegister(stringname)8

{9this._scope.RemoveVariable(name);10 }11}

在上一讲的源代码中,我们保存了一个ScriptScope对象。用户输入的脚本就是在这个Scope对象上运行的。因此,我们在这里向ScriptScope中添加的变量,就能够被用户输入的脚本所访问了。

在测试程序中,我添加了如下的代码来将对象注册到脚本运行环境中。

1

publicpartialclassForm1 : Form2

{3publicForm1()4

{5 InitializeComponent();67this._dlConsole.Registor(this.button1,"Button1");8this._dlConsole.Registor(this.textBox1,"TextBox1");9 }10}

这时,我们就可以实现类似“Button1.Text = "Hello IronPython"”和“Button1.BackColor = TextBox1.ForeColor”这样的脚本了。但是,你会发现,如果你输入类似“Button1.BackColor = Color.Red”的脚本,会产生一个“name 'Color' is not defined”的异常。是因为在目前的Scope中无法找到Color的定义引起的。

3. 使用CLR类型

如果需要在IronPython中使用CLR类型,需要完成以下几个步骤:

a) 引入clr对象:这个对象实现了对CLR访问的一些必要的操作。例如:添加引用。

b) 添加引用:通过clr.AddReference方法,你可以使用Assembly的名字作为参数来添加对这个Assembly的引用。IronPython会使用.NET加载Assembly的策略去寻找和加载这个Assembly。

c) 引入变量:通过IronPython的“import”或“from ... import ...”语法,将你需要使用的类型引入当前Scope。

之后,你就可以使用类似“x = Form()”语法构建一个对象或通过类似“Color.Red”的语法访问对象的静态成员。

最后,给一个比较复杂的例子,从中可以理解一下IronPython的语法。

1

importclr2clr.AddReference("System.Windows.Forms")34fromSystem.Windows.FormsimportForm5fromSystem.Windows.FormsimportButton6fromSystem.Windows.FormsimportDockStyle78form=Form()9button=Button()10button.Text="http://cajon.cnblogs.com"11button.Dock=DockStyle.Fill12form.Controls.Add(button)13form.ShowDialog()

运行效果:

需要说明一下,因为在控制台上输入的脚本都是在同一个Scope对象上运行的,因此,import语句只需要运行一次就可以了。也就是说,上面的代码执行后,你可以继续使用Form、Button等类型。

4. 总结

微软在DLR和CLR之间交互方面的考虑很多,因此,对一些简单的操作,我们甚至感觉不到CLR对象和一个IronPython对象之间的区别。当然,动态语言的优势即在于它的动态类型系统,这一点和CLR的静态类型系统有很大的差别。因此很多IronPython的特性(例如:动态添加属性到对象上)无法在CLR对象上使用。在后面的章节中,我们将通过一些扩展接口实现更高级的嵌入。

另一方面,将方法注册到动态语言运行环境中也是大家比较关心的一个话题。虽然,通过注册对象到运行环境,已经可以在脚本中访问这些对象的方法。但毕竟不如直接使用方法来的简单。下一节将会详细的讨论相关的实现。敬请关注

免责声明:本系列文章,完全是我个人研读IronPython源代码后找到的实现方案,并未详细的研究过IronPython的相关官方文档。因此,并不保证符合微软DLR和IronPython的设计思路,亦不能保证 在DLR和IronPython 2.0正式发布后能够继续使用。

ironpython clr_[集成IronPython] 添加CLR对象到运行环境相关推荐

  1. ironpython 教程_「ironpython」VS2017 IronPython做界面

    本人开始做毕设了,但老师说工具要有界面,所以就开始找Python做界面的东西--之前做过C#的界面,脱拉拽很快界面就完成了,后来我查了下IronPython是用C#写的python解释器,也可以脱拉拽 ...

  2. ironpython2.7.8_【IronPython下载】IronPython v2.7.9.1000 官方版-开心电玩

    软件介绍 IronPython是一款支持Python语言的开源编程软件,我们可以通过这款软件来完成程序的代码编写,而且这款软件还拥有调试功能,帮助你测试程序的问题. IronPython软件简介 Ir ...

  3. 普通的旧CLR对象与数据传输对象

    POCO =普通旧CLR(或更好:Class)对象 DTO =数据传输对象 在这篇文章中有一个区别,但是坦率地说,我读过的大多数博客都以定义DTO的方式描述了POCO:DTO是用于在应用程序各层之间移 ...

  4. [转载]深入探索.NET框架内部了解CLR如何创建运行时对象

    深入探索.NET框架内部了解CLR如何创建运行时对象 发布日期: 9/19/2005 | 更新日期: 9/19/2005 Hanu Kommalapati Tom Christian 本文讨论: • ...

  5. R语言数据可视化 ggplot2基础3 添加几何对象

    R语言数据可视化 ggplot2基础3 添加几何对象 数据的统计变换 添加几何对象 数据的统计变换 添加几何对象 上一讲我们介绍的是如何创建散点图,这一讲我们介绍如何创建其他类型的图,以及怎么创建有多 ...

  6. Spring Boot——集成七牛云OSS对象存储SDK解决方案

    基本概念 七牛云OSS对象存储(Kodo):七牛云海量存储系统(Kodo)是自主研发的非结构化数据存储管理平台,支持中心和边缘存储. 平台经过多年大规模用户验证已跻身先进技术行列,并广泛应用于海量数据 ...

  7. SQLServer 事务复制中使用脚本添加某个对象的发布

    SQLServer 事务复制中使用脚本添加某个对象的发布 原文:SQLServer 事务复制中使用脚本添加某个对象的发布 -- use [发布库] --添加表:创建项目并将其添加到发布中 exec s ...

  8. vba quit此文件正由另一个应用程序或用户使用_VBA|如何添加外部对象库(或控件)引用来扩展VBA功能...

    VBA是VB的宏语言,基于对象,有大量的内部对象及其属性和方法可以使用,此外,还可以添加外部对象库引用来扩展VBA功能. 例如你在网上找了一个项目的文件,其中有对listview的使用,但你使用这个项 ...

  9. ironpython 开发_[IronPython]IronPython开发环境的安装与设定

    [IronPython]IronPython开发环境的安装与设定 身为以程序开发为乐的程序开发人员,在蛇年玩蛇也是一件很合理的事.但是玩蛇也是要准备好工具的,而笔者的.NET背景又比其他语言浓厚,几经 ...

最新文章

  1. 算法——计算的灵魂(《算法》一本写了近40年的书)
  2. 项目开发环境(h5+pc的开发思路是一样的)
  3. 计算找到出现最多的数字和次数 ,实现数组去重 ,进行排序。
  4. mysql查看索引创建进度_SQL Server查看索引重建、重组索引进度
  5. 前端学习(2957):组件之间的参数传递父传子
  6. 计算机C语言课交作业怎么交,第一份c语言作业
  7. 软齿面主要失效形式_齿轮4种常见故障原因,如何采取预防措施,避免齿轮失效...
  8. [Python] L1-022. 奇偶分家-PAT团体程序设计天梯赛GPLT
  9. 父与子python第三版_正版 父与子的编程之旅 与小卡特一起学Python 第3版(全彩印刷) 小学生编程少儿编程真好玩入门教程童趣味亲子互动教孩子学编程书...
  10. html 漂浮 广告置顶,jquery浮动图片广告代码_页面上漂浮图片广告代码
  11. 案例3-使用python实现基于opencv的银行卡号识别
  12. Home Assistant -ESP Home接入homekit篇
  13. X-Frame-Options响应头配置详解
  14. 基于QT平台的手持媒体播放器项目实战视频教程下载
  15. 同元车辆模型库——TA系列
  16. css实现鼠标禁用(鼠标滑过显示红色禁止符号)
  17. 产业集群理论及其生态学特性
  18. 转化率中找淘宝店铺推广方法(转)
  19. 这些年我用过的 6个API 接口文档平台,真的好用
  20. 笔记本耳机声音正常,外放声音出现颤音

热门文章

  1. 首发!最详细慧联TWS106-A6蓝牙耳机对比洛达1562A评测
  2. 浏览器缓存机制 转载
  3. S-232接口定义及连线
  4. Java-权限访问修饰符
  5. 一天一天学做外挂@第七天-背包里到底有什么[武林外传]
  6. xp下报错“不是有效的win32应用程序”
  7. iOS开发 System Sound Services(振动和提示音)
  8. SAP 获取内表字段名
  9. linux下仿qq聊天源代码,Linux+glade(GTK+)+C语言+mysql的模仿QQ聊天工具(完善版)...
  10. 2021年宜昌各校高考成绩查询,2021年宜昌高考状元名单公布,宜昌高考状元学校资料及最高分...