﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Colin的技术-随笔分类-Python</title><link>http://www.cnblogs.com/Cajon/category/144899.html</link><description>Focus on .NET</description><language>zh-cn</language><lastBuildDate>Mon, 06 Oct 2008 16:50:06 GMT</lastBuildDate><pubDate>Mon, 06 Oct 2008 16:50:06 GMT</pubDate><ttl>60</ttl><item><title>[集成IronPython] 使CLR对象对动态语言更友好（三）—— 使用ExtensionTypeAttribute</title><link>http://www.cnblogs.com/Cajon/archive/2008/10/06/use_ExtensionTypeAttribute_to_extend_clr_object_ironpython.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Mon, 06 Oct 2008 02:08:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/10/06/use_ExtensionTypeAttribute_to_extend_clr_object_ironpython.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1303644.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/10/06/use_ExtensionTypeAttribute_to_extend_clr_object_ironpython.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1303644.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1303644.html</trackback:ping><description><![CDATA[摘要: <img src="http://cajon.cnblogs.com/images/cnblogs_com/cajon/logo.PNG" class="desc_img"/>
<p>IronPython 2.0完全基于微软DLR平台实现的。并且提供了良好的和.NET CLR对象之间交互的能力。在本系列文章里，我们将尝试实现一个自定义控件，使得你可以象使用标准Python控制台一样在其中输入Python代码，并且运行。</p><p>当然，为了能够让IronPython很好的操作CLR对象，其中还是有很多技巧，让你的CLR对象对IronPython更友好，这一节，我们就要使用ExtensionTypeAttribute为已有的CLR对象添加DLR友好性支持。</p>&nbsp;&nbsp;<a href='http://www.cnblogs.com/Cajon/archive/2008/10/06/use_ExtensionTypeAttribute_to_extend_clr_object_ironpython.html'>阅读全文</a><img src ="http://www.cnblogs.com/Cajon/aggbug/1303644.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 使CLR对象对动态语言更友好（一）—— 支持运行时添加删除属性</title><link>http://www.cnblogs.com/Cajon/archive/2008/08/18/support_add_remove_attribute_on_clr_object_ironpython.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Mon, 18 Aug 2008 03:59:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/08/18/support_add_remove_attribute_on_clr_object_ironpython.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1269561.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/08/18/support_add_remove_attribute_on_clr_object_ironpython.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1269561.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1269561.html</trackback:ping><description><![CDATA[<p>动态类型语言（以下简称："动态语言"），在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发 人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起，动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使 用动态语言来实现，其中，国内比较优秀的作品有&#8220;<a title="豆瓣" target="_blank" href="http://www.douban.com/">豆瓣</a>&#8221;。微软更是不甘落后，建立了DLR（动态语言运行时）来吸引动态语言爱好者在其上实现动态语言。<a target="_blank" href="http://www.cnblogs.com/Cajon/admin/www.codeplex.com/ironpython">IronPython</a>就是其主要成员之一。</p>
<p>在本系列文章中，我们将逐步实现一个自定义控件，实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【<a href="http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html">返回目录</a>】</p>
<hr size="2" width="100%" />
<p class="introduction">在<a href="http://www.cnblogs.com/Cajon/archive/2008/08/16/using_module_to_extend_ironpython.html">上一节</a>中， 实现自定义模块的尝试失败了。后来仔细想想，也许有了clr module，以及IronPython在CLR对象的封装上实现了很多对IronPython兼容特性（呵呵，我想这个就可以做一个专题讨论）。我们大多时候已经可以将CLR对象当作IronPython对象一样操作了。也许这就是为什么IronPython不打算将PythonModuleAttribute提供给我们用的原因。谁知道呢，也许微软提供了途径，我没有找到。<br />
</p>
<p>IronPython在对CLR对象进行封装时，已经进行了很多兼容方面的考虑。但是，有些东西，IronPython仅仅提供了方案。真正的实现还是要我们自己来了。</p>
<p>比如：<strong>让一个CLR对象支持动态类型。即运行时添加删除属性和方法。</strong><br />
</p>
<p><strong></strong>大家知道，对于静态类型语言，一个对象的类型在它被创建时就被确定下来，并且不能被改变。而一个类型具有哪些成员也是在编译时被确定下来的。因此，下面的代码在编译时就会报错。<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Foo<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_17_147_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_17_147_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_17_147_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_17_147_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_17_147_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_17_147_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_17_147_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_17_147_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_17_147_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_17_147_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img id="Codehighlighter1_38_51_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_51_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_38_51_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_51_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_38_51_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_51_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_38_51_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_51_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;B</span></span><span id="Codehighlighter1_17_147_Open_Text"><span style="color: #000000;">ar&nbsp;</span><span id="Codehighlighter1_38_51_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_38_51_Open_Text"><span style="color: #000000;">{&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Main()<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img id="Codehighlighter1_87_145_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_87_145_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_87_145_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_87_145_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_87_145_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_87_145_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_87_145_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_87_145_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_87_145_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_87_145_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;foo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Foo();<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foo.xxx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">10</span><span style="color: #000000;">; // 这一行编译失败<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
</span></div>
<p>而对于动态类型语言，类似上面的代码就完全是合法的代码。对于大多数习惯了C#这样的强类型语言的开发人员（包括我自己）可能都觉得这样的规定除了增加出错概率外，没有任何意义。但是，这样的规定配合一些其它功能（比较有名的就是鸭子接口），这样的设计反而可以发挥出来巨大的优势。好的，我们不来讨论哪种语言更好，仅仅给出上面代码的IronPython版本。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Foo:<br />
</span><span style="color: #008080;">2</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Bar&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;0<br />
</span><span style="color: #008080;">3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />foo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Foo()<br />
</span><span style="color: #008080;">5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />foo.xxx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span></div>
<p>呵呵，Python确实比C#精炼<img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /></p>
<p>如果使用我们的DLConsole,你会发现对于我们植入的对象（比如：Button1和TextBox1),下面的代码就会产生一个MissingMemberException('Button' object has no attribute 'xxx')。<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Button1.xxx&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span></div>
<p>先让我们从头开始实现一个类型，让你可以在其中添加和删除成员。代码如下：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DLRFriendlyObject<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;_dict&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;呵呵，这个属性就永远都不能被IronPython访问了。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;Foo&nbsp;{&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">this&nbsp;should&nbsp;not&nbsp;be&nbsp;returned</span><span style="color: #800000;">"</span><span style="color: #000000;">;&nbsp;}&nbsp;}<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;[SpecialName]<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetCustomMember(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(name&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">_dict</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;_dict;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;_dict[name];<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;[SpecialName]<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetMember(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;value)<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_dict[name]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;[SpecialName]<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;DeleteMember(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_dict.Remove(name);<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;[SpecialName]<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetMemberNames()<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;_dict.Keys;<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">}</span></div>
<p style="color: #808080;">注：因为这个类型和DLConsole没有直接关系，因此，上面的代码在TestDynamicLanguageConsole工程中。</p>
<p>上面的代码中，出现了一个比较特别的Attribute [SpecialName]，它被定义在&#8220;System.Runtime.CompilerServices&#8221;命名空间下，也就是说，它并不是DLR定义的Attribute。查了一下MSDN，发现&#8220;.NET Framework 中目前不使用 <strong>SpecialNameAttribute</strong> 类，但该类被保留以备将来之用。&#8221;。呵呵，看来微软早就留了一手。</p>
<p>这一节中添加的几个Special的方法，都添加了这个Attribute。你会发现，随后的几节中，你随时都会发现这个Attribute的身影。如果你不添加这个Attribute，IronPython都会将它们当作普通成员处理。<br />
</p>
<p>除此之外，就是四个固定名称的方法：GetCustomMember, SetMember, DeleteMember和GetMemberNames。实现这些方法，使用一个标准的Dictionary储存这些属性就可以了。现在，你就可以在IronPython中象操作动态类型对象一样的操作这个对象了。<br />
</p>
<p>为了简单，我的演示程序中直接将该对象注册到Scope中了。你可以使用<a href="http://www.cnblogs.com/Cajon/archive/2008/07/26/access_clr_object_in_python.html">第二讲</a>中的方法，通过clr模块从头构建这个对象。</p>
<p>下面是运行效果图</p>
<p> <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/cajon/integrate_ironpython_into_winform/support_add_remove_attribute_on_clr_object_ironpython.PNG" height="206" width="432" /><br />
</p>
<p>但是，实现这几个方法后，一个最直接的影响就是IronPython默认实现的属性读取和调用方法都失效了。也就是如果你直接访问Friend.Foo属性将会收到一个KeyNotFoundException（The given key was not present in the dictionary.）。因此，你需要对原有的属性和方法进行一些处理。方式可以类似上面代码中关于&#8220;_dict&#8221;的处理。</p>
<p><a href="http://www.cnblogs.com/Cajon/archive/2008/08/23/support_ironpython_slice_in_dotnet.html">下一节</a>，我们将会实现一个Collection对象，让它能够支持IronPython的切片操作和列表解析。敬请<a href="http://feed.feedsky.com/cajon">关注<img src="http://img.feedsky.com/images/icon_sub_c1s16_d.gif" alt="feedsky" style="margin-bottom: 3px;" border="0" vspace="2" /></a> <img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /></p>
<p>大家可以从<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>可运行的源代码。<br />
</p>
<p><span style="color: #808080;">免责声明：本系列文章，完全是我个人研读IronPython源代 码后找到的实现方案，并未详细的研究过IronPython的相关官方文档。因此，并不保证符合微软DLR和IronPython的设计思路，亦不能保证 在DLR和IronPython 2.0正式发布后能够继续使用。</span>&nbsp; <br />
</p>
<p> </p><img src ="http://www.cnblogs.com/Cajon/aggbug/1269561.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 使用Module扩展IronPython</title><link>http://www.cnblogs.com/Cajon/archive/2008/08/16/using_module_to_extend_ironpython.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sat, 16 Aug 2008 09:24:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/08/16/using_module_to_extend_ironpython.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1269395.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/08/16/using_module_to_extend_ironpython.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1269395.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1269395.html</trackback:ping><description><![CDATA[<p> </p>
<p><strong style="font-size: 36pt;"><br />
失败</strong></p>
<p> 在IronPython的源代码中，提供了一个PythonModuleAttribute，我原以为这个Attribute是为自定义Module建立的。在clr.AddReference时会检查Assembly中的所有PythonModuleAttribute。并将指定的类型作为Module导入到Python的运行环境中。</p>
<p>但是，今天实际测试的结果并不是这样。IronPython仅在自己的IronPython.dll和IronPython.Modules.dll中支持这个Attribute.</p>
<p>目前看来，向Scope中添加Clr对象还是比较正统的实现方式。关于其他的扩展途径，还正在研究中。</p>
<p>跳过这一节，下一节《<a href="http://www.cnblogs.com/Cajon/archive/2008/08/16/support_add_remove_attribute_on_clr_object_ironpython.html?updated=1">使CLR对象对动态语言更友好（一）</a>》中，我将实现一个CLR对象，可以支持最基本的动态语言特性——运行时添加删除属性。<br />
</p><img src ="http://www.cnblogs.com/Cajon/aggbug/1269395.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 添加方法到运行环境</title><link>http://www.cnblogs.com/Cajon/archive/2008/08/04/add_method_into_python.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Mon, 04 Aug 2008 02:29:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/08/04/add_method_into_python.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1259278.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/08/04/add_method_into_python.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1259278.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1259278.html</trackback:ping><description><![CDATA[<p>动态类型语言（以下简称："动态语言"），在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发 人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起，动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使 用动态语言来实现，其中，国内比较优秀的作品有&#8220;<a title="豆瓣" target="_blank" href="http://www.douban.com/">豆瓣</a>&#8221;。微软更是不甘落后，建立了DLR（动态语言运行时）来吸引动态语言爱好者在其上实现动态语言。<a target="_blank" href="http://www.cnblogs.com/Cajon/admin/www.codeplex.com/ironpython">IronPython</a>就是其主要成员之一。</p>
<p>在本系列文章中，我们将逐步实现一个自定义控件，实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【<a href="http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html">返回目录</a>】</p>
<hr size="2" width="100%" />
<p class="introduction">在<a href="http://www.cnblogs.com/Cajon/archive/2008/07/28/access_clr_object_in_python.html">上一节</a>中，我们成功的将CLR对象添加到了IronPython的运行环境中。相信通过上一节的内容。大多数人都已经可以很容易的将IronPython集成到自己的应用程序中。但是，某些时候，我们为了给我们的用户以更好地体验。需要对IronPython进行一些扩展，比如：添加自定义的方法到IronPython环境。</p>
<p><strong>1. 先看运行效果</strong></p>
<p> 我在DLConsole中输入如下的脚本：<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">TextBox1.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;str(Sum(</span><span style="color: #000000;">10</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">25</span><span style="color: #000000;">))</span></div>
<p>运行结果如图：</p>
<p><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/cajon/integrate_ironpython_into_winform/AddMethodIntoPython.PNG" height="169" width="500" />&nbsp;</p>
<p><strong>2. 向DLConsole中注册Delegate</strong></p>
<p>之前，已经可以将一个对象注册到ScriptScope中，并且通过它的名字访问这个对象。大多数现代的语言中，都已经能够将方法作为对象传递。.NET是通过Delegate对方法进行的封装和传递的。DLR中也对Delegate提供了很好的支持。因此，我们不需要对DLConsole进行任何修改，就可以完成这个工作。下面的代码是测试工程的代码。<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;TestDynamicLanguageConsole<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_37_503_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_37_503_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_37_503_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_37_503_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_37_503_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_37_503_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_37_503_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_37_503_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_37_503_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_37_503_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">partial</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Form1&nbsp;:&nbsp;Form<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_81_501_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_81_501_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_81_501_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_81_501_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_81_501_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_81_501_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_81_501_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_81_501_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_81_501_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_81_501_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Form1()<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img id="Codehighlighter1_114_356_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_114_356_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_114_356_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_114_356_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_114_356_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_114_356_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_114_356_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_114_356_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_114_356_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_114_356_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dlConsole.Registor(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.button1,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Button1</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dlConsole.Registor(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.textBox1,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">TextBox1</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: yellow;"><span style="color: #0000ff;">this</span><span style="color: #000000;">._dlConsole.Registor(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SumDelegate(Sum),&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Sum</span><span style="color: #800000;">"</span><span style="color: #000000;">);</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">delegate</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;SumDelegate(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y);<br />
</span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Sum(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y)<br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img id="Codehighlighter1_458_495_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_458_495_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_458_495_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_458_495_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_458_495_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_458_495_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_458_495_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_458_495_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_458_495_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_458_495_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;y;<br />
</span><span style="color: #008080;">18</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">19</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<p>在代码的第11行，我们将一个方法注册到DLConsole中，命名为"Sum"。就实现了上面展示的功能。</p>
<p>至此，我们已经可以通过向ScriptScope中注册Delegate的方式，使Python脚本使用我们自定义的方法。但是，你会发现这样的实现方式虽然简便快捷，却无法实现函数的重载。也就是说，你不能针对不同的数据类型注册多个Sum方法。</p>
<p>在<strike>下一节《<a href="http://www.cnblogs.com/Cajon/archive/2008/08/16/using_module_to_extend_ironpython.html">使用Module扩展IronPython</a>》中，我们将建立一个自定义模块，在其中，我们可以实现函数的重载</strike>。(2008-08-16更新：通过实验，发现我所设想的路线是错误的。您可以继续关注下一篇《<a href="http://www.cnblogs.com/Cajon/archive/2008/08/16/support_add_remove_attribute_on_clr_object_ironpython.html?updated=1">使CLR对象对动态语言更友好（一）</a>》。我将实现一个CLR对象，可以支持最基本的动态语言特性——运行时添加删除属性。)敬请<a href="http://feed.feedsky.com/cajon">关注<img src="http://img.feedsky.com/images/icon_sub_c1s16_d.gif" alt="feedsky" style="margin-bottom: 3px;" border="0" vspace="2" /></a> <img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /></p>
<p>大家可以从<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>可运行的源代码。 <br />
</p>
<p><span style="color: #808080;">免责声明：本系列文章，完全是我个人研读IronPython源代码后找到的实现方案，并未详细的研究过IronPython的相关官方文档。因此，并不保证符合微软DLR和IronPython的设计思路，亦不能保证 在DLR和IronPython 2.0正式发布后能够继续使用。</span> <br />
</p>
<p>
</p><img src ="http://www.cnblogs.com/Cajon/aggbug/1259278.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 添加CLR对象到运行环境</title><link>http://www.cnblogs.com/Cajon/archive/2008/07/28/access_clr_object_in_python.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Mon, 28 Jul 2008 01:17:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/07/28/access_clr_object_in_python.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1252157.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/07/28/access_clr_object_in_python.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1252157.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1252157.html</trackback:ping><description><![CDATA[<p>动态类型语言（以下简称："动态语言"），在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发 人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起，动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使 用动态语言来实现，其中，国内比较优秀的作品有&#8220;<a title="豆瓣" target="_blank" href="http://www.douban.com/">豆瓣</a>&#8221;。微软更是不甘落后，建立了DLR（动态语言运行时）来吸引动态语言爱好者在其上实现动态语言。<a target="_blank" href="http://www.cnblogs.com/Cajon/admin/www.codeplex.com/ironpython">IronPython</a>就是其主要成员之一。</p>
<p>在本系列文章中，我们将逐步实现一个自定义控件，实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【<a href="http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html">返回目录</a>】</p>
<hr size="2" width="100%" />
<p class="introduction">在<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/create_python_host.html">上一节</a>中，我们建立了IronPython运行环境，并且在其中成功的运行了&#8220;print "hello world"&#8221;的命令。正如上一节的讨论中所看到的，大家都很关心如何让IronPython脚本和我们的运行环境交互。在这一节中，我们将会在DLConsole上添加两个方法，实现将运行环境中的Clr对象传递给IronPython脚本使用。</p>
<p>大家可以从<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>可运行的源代码。 <br />
</p>
<p><span style="font-weight: bold;">1. 先看运行效果</span>。<br />
</p>
<p>我在DLConsole中输入如下脚本：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;clr<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />clr.AddReference(</span><span style="color: #800000;">"</span><span style="color: #800000;">System.Drawing</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />clr.AddReference(</span><span style="color: #800000;">"</span><span style="color: #800000;">System.Windows.Forms</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;System.Drawing&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Color<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;System.Windows.Forms&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;FlatStyle<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />Button1.BackColor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Color.Red;<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />Button1.FlatStyle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FlatStyle.Flat<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />Button1.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Hello&nbsp;IronPython</span><span style="color: #800000;">"</span></div>
<p>运行结果，如图：<br />
</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/cajon/integrate_ironpython_into_winform/ControlClrObject.png" height="188" width="481" />&nbsp;</p>
<p><span style="font-weight: bold;">2. 确保脚本可以访问CLR对象</span> <br />
</p>
<p>首先，我们需要脚本能够成功的访问CLR对象。我在DLConsole上暴露了两个方法。分别是：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">partial</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DLConsole&nbsp;:&nbsp;UserControl<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_45_248_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_45_248_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_45_248_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_45_248_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_45_248_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_45_248_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_45_248_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_45_248_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_45_248_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_45_248_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Registor(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_101_152_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_101_152_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_101_152_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_101_152_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_101_152_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_101_152_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_101_152_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_101_152_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_101_152_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_101_152_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._scope.SetVariable(name,&nbsp;obj);<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;UnRegister(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img id="Codehighlighter1_197_246_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_197_246_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_197_246_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_197_246_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_197_246_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_197_246_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_197_246_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_197_246_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_197_246_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_197_246_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._scope.RemoveVariable(name);<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<p>在上一讲的源代码中，我们保存了一个ScriptScope对象。用户输入的脚本就是在这个Scope对象上运行的。因此，我们在这里向ScriptScope中添加的变量，就能够被用户输入的脚本所访问了。</p>
<p>在测试程序中，我添加了如下的代码来将对象注册到脚本运行环境中。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">partial</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Form1&nbsp;:&nbsp;Form<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_34_220_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_34_220_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_34_220_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_34_220_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_34_220_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_34_220_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_34_220_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_34_220_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_34_220_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_34_220_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Form1()<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_59_218_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_59_218_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_59_218_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_59_218_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_59_218_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_59_218_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_59_218_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_59_218_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_59_218_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_59_218_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dlConsole.Registor(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.button1,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Button1</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._dlConsole.Registor(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.textBox1,&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">TextBox1</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<p> </p>
<p>这时，我们就可以实现类似&#8220;Button1.Text = "Hello IronPython"&#8221;和&#8220;Button1.BackColor = TextBox1.ForeColor&#8221;这样的脚本了。但是，你会发现，如果你输入类似&#8220;Button1.BackColor = Color.Red&#8221;的脚本，会产生一个&#8220;name 'Color' is not defined&#8221;的异常。是因为在目前的Scope中无法找到Color的定义引起的。<br />
</p>
<p style="font-weight: bold;">3. 使用CLR类型</p>
<p> 如果需要在IronPython中使用CLR类型，需要完成以下几个步骤：<br />
</p>
<p>a) 引入clr对象：这个对象实现了对CLR访问的一些必要的操作。例如：添加引用。<br />
b) 添加引用：通过clr.AddReference方法，你可以使用Assembly的名字作为参数来添加对这个Assembly的引用。IronPython会使用.NET加载Assembly的策略去寻找和加载这个Assembly。<br />
c) 引入变量：通过IronPython的&#8220;import&#8221;或&#8220;from ... import ...&#8221;语法，将你需要使用的类型引入当前Scope。</p>
<p>之后，你就可以使用类似&#8220;x = Form()&#8221;语法构建一个对象或通过类似&#8220;Color.Red&#8221;的语法访问对象的静态成员。<br />
</p>
<p>最后，给一个比较复杂的例子，从中可以理解一下IronPython的语法。<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;clr<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />clr.AddReference(</span><span style="color: #800000;">"</span><span style="color: #800000;">System.Windows.Forms</span><span style="color: #800000;">"</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;System.Windows.Forms&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Form<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;System.Windows.Forms&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Button<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;System.Windows.Forms&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;DockStyle<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />form&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Form()<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />button&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Button()<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />button.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">http://cajon.cnblogs.com</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />button.Dock&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DockStyle.Fill<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />form.Controls.Add(button)<br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />form.ShowDialog()</span></div>
<p>运行效果：</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/cajon/integrate_ironpython_into_winform/ShowForm.PNG" height="264" width="645" /> <br />
</p>
<p>需要说明一下，因为在控制台上输入的脚本都是在同一个Scope对象上运行的，因此，import语句只需要运行一次就可以了。也就是说，上面的代码执行后，你可以继续使用Form、Button等类型。 <br />
</p>
<p><span style="font-weight: bold;">4. 总结</span><br />
</p>
<p>微软在DLR和CLR之间交互方面的考虑很多，因此，对一些简单的操作，我们甚至感觉不到CLR对象和一个IronPython对象之间的区别。当然，动态语言的优势即在于它的动态类型系统，这一点和CLR的静态类型系统有很大的差别。因此很多IronPython的特性（例如：动态添加属性到对象上）无法在CLR对象上使用。在后面的章节中，我们将通过一些扩展接口实现更高级的嵌入。</p>
<p>另一方面，将方法注册到动态语言运行环境中也是大家比较关心的一个话题。虽然，通过注册对象到运行环境，已经可以在脚本中访问这些对象的方法。但毕竟不如直接使用方法来的简单。<a href="http://www.cnblogs.com/Cajon/archive/2008/08/03/add_method_into_python.html">下一节</a>将会详细的讨论相关的实现。敬请<a href="http://feed.feedsky.com/cajon">关注<img src="http://img.feedsky.com/images/icon_sub_c1s16_d.gif" alt="feedsky" style="margin-bottom: 3px;" border="0" vspace="2" /></a> <img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /></p>
<p><span style="color: #808080;">免责声明：本系列文章，完全是我个人研读IronPython源代码后找到的实现方案，并未详细的研究过IronPython的相关官方文档。因此，并不保证符合微软DLR和IronPython的设计思路，亦不能保证 在DLR和IronPython 2.0正式发布后能够继续使用。</span></p><img src ="http://www.cnblogs.com/Cajon/aggbug/1252157.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 建立运行环境并运行脚本</title><link>http://www.cnblogs.com/Cajon/archive/2008/07/19/create_python_host.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sat, 19 Jul 2008 08:24:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/07/19/create_python_host.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1241938.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/07/19/create_python_host.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1241938.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1241938.html</trackback:ping><description><![CDATA[<p>动态类型语言（以下简称："动态语言"），在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起，动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使用动态语言来实现，其中，国内比较优秀的作品有&#8220;<a title="豆瓣" target="_blank" href="http://www.douban.com/">豆瓣</a>&#8221;。微软更是不甘落后，建立了DLR（动态语言运行时）来吸引动态语言爱好者在其上实现动态语言。<a target="_blank" href="http://www.cnblogs.com/Cajon/admin/www.codeplex.com/ironpython">IronPython</a>就是其主要成员之一。</p>
<p>在本系列文章中，我们将逐步实现一个自定义控件，实现类似IDE的Immediate窗口的功能。用户可以在其中输入和运行IronPython代码。 【<a href="http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html">返回目录</a>】</p>
<hr size="2" width="100%" />
<br />
<p class="introduction"><strong><span style="color: #000000;">首</span></strong>先我们需要建立一个运行环境，并确保能够在其上运行Python脚本。大家可以从<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>可运行的源代码。</p>
<p>我们首先来看一下运行结果：<span style="color: #999999;">（提示：目前该程序是通过Ctrl+Enter执行你输入的代码。下面的输出窗口是IDE的Output窗口）</span></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/cajon/integrate_ironpython_into_winform/FirstRun.PNG"><img alt="第一个版本运行效果图" src="http://www.cnblogs.com/images/cnblogs_com/cajon/integrate_ironpython_into_winform/FirstRun.PNG" width="500" height="344" /><br />
点击看大图 </a><br />
</p>
<span id="Code_Open_Text_150500" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">这里是运行结果的效果图。</span></span>
<span id="Code_Open_Text_150231" style="display: none;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" />test</span>
<p>其中主要的代码如下：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;DynamicLanguageConsole<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_33_816_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_33_816_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_33_816_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_33_816_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_33_816_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_33_816_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_33_816_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_33_816_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_33_816_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_33_816_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">partial</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DLConsole&nbsp;:&nbsp;UserControl<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_88_814_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_88_814_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_88_814_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_88_814_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_88_814_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_88_814_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_88_814_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_88_814_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_88_814_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_88_814_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;DLConsole()<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img id="Codehighlighter1_125_552_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_125_552_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_125_552_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_125_552_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_125_552_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_125_552_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_125_552_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_125_552_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_125_552_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_125_552_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptRuntimeSetup&nbsp;runtimeSetup&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ScriptRuntimeSetup(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._runtime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ScriptRuntime.Create(runtimeSetup);<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._engine&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._runtime.GetEngine(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(PythonContext));<br />
</span><span style="color: #008080;">12</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;你亦可以使用下面的代码获得脚本引擎，但是，下面的方法可能会在未来版本被废弃<br />
</span><span style="color: #008080;">13</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;this._engine&nbsp;=&nbsp;PythonEngine.CurrentEngine;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">14</span><span style="color: #008000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._scope&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._engine.CreateScope();<br />
</span><span style="color: #008080;">15</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptRuntime&nbsp;_runtime;<br />
</span><span style="color: #008080;">18</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptEngine&nbsp;_engine;<br />
</span><span style="color: #008080;">19</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptScope&nbsp;_scope;&nbsp;<br />
</span><span style="color: #008080;">20</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">21</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Exec(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;script)<br />
</span><span style="color: #008080;">22</span><span style="color: #000000;"><img id="Codehighlighter1_695_807_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_695_807_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_695_807_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_695_807_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_695_807_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_695_807_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_695_807_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_695_807_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_695_807_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_695_807_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">23</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_engine.CreateScriptSourceFromString(script,&nbsp;SourceCodeKind.Statements).Execute(_scope);<br />
</span><span style="color: #008080;">24</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">25</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<p>
</p>
<p>程序中，我们保存了三个局部变量，ScriptRuntim，ScriptEngine和ScriptScope。<br />
</p>
<p>脚本运行时（ScriptRuntime）：Hosting动态语言的入口。通过这个对象，你可以获得脚本引擎。添加全局变量等。<br />
脚本引擎（ScriptEngine）：实现语言特定的脚本功能，例如：编译源代码。<br />
脚本空间（ScriptScope）：提供了脚本运行的空间，脚本将会把其中定义的对象和变量等存储与这个空间里。.NET CLR对象也可以通过这个对象和脚本进行对象的共享。在《第三章：<a href="http://www.cnblogs.com/Cajon/archive/2008/07/26/access_clr_object_in_python.html">添加CLR对象到运行环境</a>》中我们将会使用这个对象。</p>
<p>下面的图也许可以帮助你了解他们之间的关系。</p>
<a href="http://www.cnblogs.com/images/cnblogs_com/cajon/integrate_ironpython_into_winform/HighLevelHostingObjectRelation.PNG">
<p><img alt="High Level Hosting Object Relation" src="http://www.cnblogs.com/images/cnblogs_com/cajon/integrate_ironpython_into_winform/HighLevelHostingObjectRelation.PNG" width="500" height="261" /> <br />
点击看大图</p>
</a>
<p>我们需要做的，就是构造这样三个对象（程序中的10-14行），然后，使用脚本引擎来编译用户输入的源代码，并且让该代码在ScriptScope上运行（程序中的23行）。 </p>
<p>好了，仅仅需要这样7行代码，你的应用程序就具有了执行动态语言的能力。接下来，要让控制台控件更象一个标准的Python控制台《第二章：实现IConsole接口》。敬请<a href="http://feed.feedsky.com/cajon">关注<img src="http://img.feedsky.com/images/icon_sub_c1s16_d.gif" alt="feedsky" style="margin-bottom: 3px;" vspace="2" border="0" /></a> <img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /></p>
<p><span style="color: #808080;">免责声明：本系列文章，完全是我个人研读IronPython源代码后找到的实现方案，并未详细的研究过IronPython的相关官方文档。因此，并不保证符合微软DLR和IronPython的设计思路，亦不能保证在DLR和IronPython 2.0正式发布后能够继续使用。</span>
</p><img src ="http://www.cnblogs.com/Cajon/aggbug/1241938.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 集成IronPython系列源代码下载</title><link>http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sat, 19 Jul 2008 08:19:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1246660.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1246660.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1246660.html</trackback:ping><description><![CDATA[摘要: 本系列文章中使用到的IronPython2.0Bata3的程序集请通过下面的链接下载：Lib.rarStep1:《建立运行环境并运行脚本》Step1.rar：实现了基本的...&nbsp;&nbsp;<a href='http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html'>阅读全文</a><img src ="http://www.cnblogs.com/Cajon/aggbug/1246660.html?type=1" width = "1" height = "1" />]]></description></item><item><title>[集成IronPython] 集成IronPython系列</title><link>http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sun, 13 Jul 2008 07:45:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1241864.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/07/13/integrate_ironpython_into_winform.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1241864.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1241864.html</trackback:ping><description><![CDATA[<p class="introduction">动态类型语言（以下简称："动态语言"），应该说有很古老的历史了，10年前就已经在学术圈内流行起来。JavaScript更是成为了WEB前台开发的事实标准。但是他们进入普通开发人员的视野也就是在最近几年。随着Web 2.0和敏捷开发方法论的兴起。动态语言的灵活高效成为了他被大多数项目选择和使用的理由。一些大型的项目和网站都开始使用动态类型语言实现，其中，国内比较优秀的作品有&#8220;<a title="豆瓣" target="_blank" href="http://www.douban.com/">豆瓣</a>&#8221;。各个大公司也纷纷加入其中。不断的推进着动态语言的发展。其中最典型的就是<a target="_blank" href="http://www.cnblogs.com/Cajon/admin/www.googlecode.com">Google</a>对<a target="_blank" href="http://www.python.org/">Python</a>语言的推崇。</p>
<p>最近Google推出了<a target="_blank" href="http://code.google.com/appengine/">App Engine</a>平台，为广大的开发人员提供了一个低成本，高扩展性的实现平台。关于App Engine的详细信息，后面我有时间的时候，考虑介绍一下。现在大家可以上网<a target="_blank" href="http://www.google.cn/search?q=App+Engine&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:zh-CN:official&amp;client=firefox">搜索一下</a>。有很多详细的介绍。</p>
<p>推动动态语言发展的并不仅限于Google一家，IBM, Sun等公司也有相应的举措。微软，当然也不会落后，推出了他自己的动态语言平台——<a target="_blank" href="http://msdn.microsoft.com/en-us/magazine/cc163344.aspx">DLR</a> 并且在其上实现了<a target="_blank" href="http://www.codeplex.com/IronPython">IronPython</a>, <a target="_blank" href="http://rubyforge.org/projects/ironruby">IronRuby</a>和JavaScript（其中，前两个应该算是社区作品，并且是开源的。最后一个是微软自己的实现，并且，目前还没有看到开源的说）。</p>
<p>目前我找不到DLR的源代码的独立下载地址，大家只能通过下载IronPython或IronRuby的源代码来获得DLR的源代码。简单来说，DLR就像.NET的CLR一样为动态语言提供了一套公共的运行时支持（例如：解释器，GC，语法树以及和CLR的交互等）。用微软官方的说法：DLR使动态语言开发者能够将精力放在该语言核心的功能上，而不是这些通用的功能。至少动态语言开发者并不再需要重写一套GC。虽然，很多开发人员总喜欢做这些。</p>
<p>微软的DLR使得动态语言开发者能够加少很多工作量，同样对于我们这些希望能够将动态语言嵌入到我们的应用程序中的开发人员也是一种好事。我们可以面向DLR去设计，提供基本的平台。然后，针对各种不同语言的特性进行一些优化，就可以简单的将他们嵌入到我们的运行环境里来。</p>
<p>随后的一系列文章中，我将制作一个自定义WinForm控件。该控件的功能就像一个控制台，通过将这个自定义控件嵌入你的窗口，使用户可以在其中输入代码并执行。大家可以将它想象为IDE中的Immediate窗口。</p>
<p>1. <a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/create_python_host.html">建立运行环境并运行脚本</a><br />
2. 实现IConsole接口，重定向输入输出<br />
3. <a href="http://www.cnblogs.com/Cajon/archive/2008/07/26/access_clr_object_in_python.html">添加CLR对象到运行环境</a><br />
4. <a href="http://www.cnblogs.com/Cajon/archive/2008/08/03/add_method_into_python.html">添加方法到运行环境</a><br />
5. <strike><a href="http://www.cnblogs.com/Cajon/archive/2008/08/16/using_module_to_extend_ironpython.html">使用Module扩展IronPython</a> </strike>（失败的项目，微软没有提供对PythonModuleAttribute的支持）<br />
6. 使CLR对象对动态语言更友好<br />
&nbsp;&nbsp; 6.1 <a href="http://www.cnblogs.com/Cajon/archive/2008/08/16/support_add_remove_attribute_on_clr_object_ironpython.html">支持运行时添加删除属性<br />
</a>&nbsp;&nbsp; 6.2 <a href="http://www.cnblogs.com/Cajon/archive/2008/08/23/support_ironpython_slice_in_dotnet.html">支持切片</a><br />
&nbsp;&nbsp; 6.3 <a href="http://www.cnblogs.com/Cajon/archive/2008/10/04/use_ExtensionTypeAttribute_to_extend_clr_object_ironpython.html">使用ExtensionTypeAttribute</a><br />
7. 使DLConsole支持其它动态语言<br />
8. 高级话题，建立安全沙箱运行IronPython脚本<br />
9. 高级话题，CLR类型和Python类型之间的映射<br />
</p>
<p>你可以在<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>本系列每个阶段的源代码<br />
本系列中所有示例将基于<a target="_blank" href="http://www.codeplex.com/IronPython/Wiki/View.aspx?title=v2.0%20Beta%203%20Release%20Notes&amp;referringTitle=Home">IronPython 2.0 Beta 3</a>.大家可以通过<a target="_blank" href="http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=12988">这里下载IronPython的源代码</a></p><img src ="http://www.cnblogs.com/Cajon/aggbug/1241864.html?type=1" width = "1" height = "1" />]]></description></item></channel></rss>