﻿<?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的技术</title><link>http://www.cnblogs.com/Cajon/</link><description>Focus on .NET</description><language>zh-cn</language><lastBuildDate>Tue, 07 Oct 2008 19:01:24 GMT</lastBuildDate><pubDate>Tue, 07 Oct 2008 19:01:24 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>7</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" /><br><br><a href="http://news.cnblogs.com/n/42828/" target="_blank">[新闻]Mono 2.0 发布 Linux 上的 .NET 框架成熟了吗？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[集成IronPython] 使CLR对象对动态语言更友好（二）—— 支持切片</title><link>http://www.cnblogs.com/Cajon/archive/2008/08/25/support_ironpython_slice_in_dotnet.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Mon, 25 Aug 2008 02:32:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2008/08/25/support_ironpython_slice_in_dotnet.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1274561.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2008/08/25/support_ironpython_slice_in_dotnet.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1274561.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1274561.html</trackback:ping><description><![CDATA[摘要: 动态类型语言（以下简称："动态语言"），在10年前就已流行起来。JavaScript更是成为了WEB前台开发的事实标准。但它们进入普通开发 人员的视野也就在近几年。随着Web2.0和敏捷开发方法论的兴起，动态语言的灵活高效的特性成为了它被更多项目选择和使用的理由。一些大型网站已开始使 用动态语言来实现，其中，国内比较优秀的作品有&#8220;豆瓣&#8221;。微软更是不甘落后，建立了DLR（动态&nbsp;&nbsp;<a href='http://www.cnblogs.com/Cajon/archive/2008/08/25/support_ironpython_slice_in_dotnet.html'>阅读全文</a><img src ="http://www.cnblogs.com/Cajon/aggbug/1274561.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42827/" target="_blank">[新闻]史上九大最强网络黑客</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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" /><br><br><a href="http://news.cnblogs.com/n/42826/" target="_blank">[新闻]微软拟2010年推新版SQL 强化商业智能功能</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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" /><br><br><a href="http://news.cnblogs.com/n/42825/" target="_blank">[新闻]GMail Labs 新功能 - 做数学题确认是否发出邮件</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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" /><br><br><a href="http://news.cnblogs.com/n/42824/" target="_blank">[新闻]OpenOffice四处创造纪录 占有全球25%办公软件市场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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" /><br><br><a href="http://news.cnblogs.com/n/42823/" target="_blank">[新闻]云计算硝烟四起 IBM携Bluehouse参战</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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" /><br><br><a href="http://news.cnblogs.com/n/42822/" target="_blank">[新闻]唱片商解密缘何反百度：态度强硬 人工干预明显</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></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" /><br><br><a href="http://news.cnblogs.com/n/42821/" target="_blank">[新闻]国外媒体评出史上十大悬疑网络犯罪</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>避免DateTimePicker闪烁的解决方案</title><link>http://www.cnblogs.com/Cajon/archive/2007/12/29/Avoid_DateTimePicker_Flicker.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sat, 29 Dec 2007 06:46:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2007/12/29/Avoid_DateTimePicker_Flicker.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/1020001.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2007/12/29/Avoid_DateTimePicker_Flicker.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/1020001.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/1020001.html</trackback:ping><description><![CDATA[<p>1. 在WinForm上放置一个TabControl，并设置其Dock属性为Fill。</p>
<p>2. 在其中的一个Tab页上放置一个DateTimePicker控件</p>
<p>你会发现，当你在XP系统下，Resize
Form时，DateTimePicker会闪烁。研究了很长时间，没有结果。最终放弃C#和Spy++，使用Google研究了一下 :-) 得出结论如下：</p>
<p>需要为DateTimePicker控件添加WS_EX_COMPOSITED Window Style.如下：</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyDateTimePicker&nbsp;:&nbsp;DateTimePicker<br />
<img id="Codehighlighter1_55_321_Open_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_321_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_55_321_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_321_Closed_Text').style.display='inline';" alt="" align="top" /><img id="Codehighlighter1_55_321_Closed_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_321_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_55_321_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_321_Open_Text').style.display='inline';" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_55_321_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_55_321_Open_Text"><span style="color: #000000;">{<br />
<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;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;CreateParams&nbsp;CreateParams<br />
<img id="Codehighlighter1_118_315_Open_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_118_315_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_118_315_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_118_315_Closed_Text').style.display='inline';" alt="" align="top" /><img id="Codehighlighter1_118_315_Closed_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_118_315_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_118_315_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_118_315_Open_Text').style.display='inline';" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_118_315_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_118_315_Open_Text"><span style="color: #000000;">{<br />
<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;">get</span><span style="color: #000000;"><br />
<img id="Codehighlighter1_148_305_Open_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_148_305_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_148_305_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_148_305_Closed_Text').style.display='inline';" alt="" align="top" /><img id="Codehighlighter1_148_305_Closed_Image" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_148_305_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_148_305_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_148_305_Open_Text').style.display='inline';" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_148_305_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_148_305_Open_Text"><span style="color: #000000;">{<br />
<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;&nbsp;&nbsp;&nbsp;&nbsp;CreateParams&nbsp;ps&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">base</span><span style="color: #000000;">.CreateParams;<br />
<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;&nbsp;&nbsp;&nbsp;&nbsp;ps.ExStyle&nbsp;</span><span style="color: #000000;">|=</span><span style="color: #000000;">&nbsp;NativeMethods.WS_EX_COMPOSITED /*0x2000000*/;<br />
<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ps;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<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 />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>这个Style仅仅被Window
XP以上系统支持。功能是将Control的所有画法使用DoubleBuffer优化。（ControlStyles.OptimizedDoubleBuffer似乎仅对WM_PAINT优化，而DateTimePicker的闪烁是由WM_ERASEBKGND引起的）</p>
<p>做个记录，以便后人查询。</p>
<p>&nbsp;</p>
<span style="color: #ff0000;"><span style="color: red;">
更新：（2008/01/03）<br />
&nbsp;&nbsp;&nbsp; 注意，这个Style仅仅被Window XP以上操作系统接受，如果在Window 2000下运行添加了这个Style的DateTimePicker将会产生异常。<br />
<br />
更新：（2008/02/03）<br />
&nbsp;&nbsp;&nbsp; 注意，这个Style会导致DateTimePicker的DropDownButton没有按下效果。因此，不建议在项目中使用这个方案。关于更详细的解决方案，稍后我重新写一篇Blog。</span></span><br />
<img src ="http://www.cnblogs.com/Cajon/aggbug/1020001.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42820/" target="_blank">[新闻]AMD拆分方案已确认 获阿联酋84亿美元投资</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[自定义Component]WinForm的AutoScale能力</title><link>http://www.cnblogs.com/Cajon/archive/2007/10/20/WIN_FORM_AUTOSCALE.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sat, 20 Oct 2007 05:46:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2007/10/20/WIN_FORM_AUTOSCALE.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/931382.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2007/10/20/WIN_FORM_AUTOSCALE.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/931382.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/931382.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>在.NET 2.0中，微软对.NET 1.0中提出的WinForm的AutoScale能力进行了调整和增强。但是，微软始终没有跳出快速开发的圈子，因此，AutoScale做的并不彻底。其中有些工作还必须我们自己完成。  </p>
<h4><a></a>1. 什么是AutoScale？</h4>
<p>我们知道，在不同的操作系统版本或语言版本之间，系统的默认字体是不同的。Window还提供了用户设置DPI的能力。因此，很多时候，我们在特定版本和DPI下设计的窗体，在另外一个操作系统下就会有一些字或图片被裁掉。如下图：  </p>
<p><img src="http://xa-wiki:8080/download/attachments/2490526/AutoScaleFailure.PNG" alt="" align="absmiddle" border="0" />  </p>
<p>.NET提供了一套关于这个问题的解决方案。就是WinForm上的一组关于AutoScale的方法或属性。包括：  </p>
<p>ContianerControl上有：  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.containercontrol.autoscalefactor.aspx">AutoScaleFactor property</a>  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.containercontrol.autoscaledimensions.aspx">AutoScaleDimensions property</a>  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.containercontrol.currentautoscaledimensions.aspx">CurrentAutoScaleDimensions property</a>  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.containercontrol.autoscalemode.aspx">AutoScaleMode property</a>  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.containercontrol.performautoscale.aspx">PerformAutoScale method</a>  </p>
<p>Control上有：  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.scale.aspx">Scale method</a>  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.scalechildren.aspx">ScaleChildren method</a>  </p>
<p><a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.getscaledbounds.aspx">GetScaledBounds method</a>  </p>
<p>一般情况下，微软会自动帮助你完成所有关于AutoScale的功能。你并不需要写特别的代码使用这些功能。  </p>
<h4><a></a>2.&nbsp; AutoScale的实现细节</h4>
<p>在DesignTime，系统会根据AutoScaleMode的设置不同，将一个参考值赋值给Form的AutoScaleDimensions属性。  </p>
<p>例如：如果你选择AutoScaleMode为Font。DesignTime会自动为Form生成一行如下的代码来保存你设计时所使用的默认字体的宽和高： </p>
<pre>this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);&amp;nbsp;</pre>
<p>Note: 当前系统为英文。因此，当前字体高度为13，宽度为6&nbsp;
</p>
<p>在运行时，CurrentAutoScaleDimensions属性会提取当前系统的相关设置。生成另外一个计算值。AutoScaleFactor属性表现了两个值的比值，作为下一步缩放的缩放因子。<br />
比如，在日文系统下运行时，CurrenAutoScaleDimensions为（6f, 12f)。AutoScaleFactor为（1f, 0.9xxxf).
</p>
<p>System.Win.Forms.ContainerControl会在OnLayout(还包括一堆其它的事件中)中对调用自己的 PerformAutoScale方法，其中对自己和它子孙调用Scale方法，并将AutoScaleFactor传入。从而实现调整他们的位置和大小，以适应当前操作系统的设置。
</p>
<h4><a></a>3. 使用AutoScale时需要注意的问题？</h4>
<p>上面的实现应该说比较巧妙，加上Visual Studio的设计时支持。应该说已经可以完美的解决所有通过DesignTime设计的窗体或自定义控件。
</p>
<p>但是，微软没有为这套系统进行完整的支持。如果你通过代码在运行时修改控件的位置或大小时，可以说你没有任何一个理想的方案来确保你的修改能够适应各种不同的操作系统设置。因为......当ContainerControl触发了PerformAutoScale方法后，为了确保下一次触发 PerformAutoScale方法不会累加操作，而将AutoScaleDimensions修改为和 CurrentAutoScaleDimensions一致。也就是说，你再也无法拿到设计时所使用的AutoScaleDimensions值。因此，你也就无法使用这套机制来确保你的修改操作可以兼容各种操作系统的设置。<img alt="" src="http://xa-wiki:8080/images/icons/emoticons/sad.gif" align="absmiddle" border="0" height="20" width="20" />
</p>
<p>在我们的产品中就有很多问题是这一点引起的。毕竟，在大多数产品中，并不会仅仅通过DesignTime托托拽拽就可以完成需求。因此，我们需要：
</p>
<h5><a></a>3.1 尽量使用DesignTime设置Control的Size和Location</h5>
<h5><a></a>3.2 如果不能使用DesignTime，自己需要维护AutoScaleDimensions值</h5>
<p>看起来，我们只能自己手动生成我们自己的AutoScaleDimensions值。VS会将那一行代码生成在 InitializeComponents方法内部，该函数推出的时候，PerformAutoScale已经被调用，因此标准的 AutoScaleDimensions属性已经不能使用了。这里需要Hard Code。 // TODO: 谁有更好的建议？
</p>
<p>并且在下列情况中手动对Control的Location或Size进行计算。
</p>
<ul>
    <li>修改Control的位置或大小时，手动计算正确的值。
    </li>
    <li>添加新Control到Controls之前，手动计算正确的Size和Location.&nbsp; </li>
</ul>
<p>我们需要使用前面我们自己维护的AutoScaleDimensions和当前容器的AutoScaleDimensions运算生成 AutoScaleFactor，然后自己计算新的位置和大小。这里，需要注意，不要参考Control的当前Size或Location。因为他们可能已经被Scale过一次了。
</p>
<p>Note: 千万不要试图通过调用Control.Scale方法来完成计算。因为，ContainerControl的Scale方法会对所有子Control进行 Scale。但是，往往ContainerControl已经在它的构造函数中对它的子进行了Scale操作。结果相当于它的子进行了两次Scale。结果是错误的。</p>
<img src ="http://www.cnblogs.com/Cajon/aggbug/931382.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42817/" target="_blank">[新闻]雅虎新闻首页改版，宽屏、共享、组件</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>.NET 开发中容易被忽略的问题--MDA</title><link>http://www.cnblogs.com/Cajon/archive/2007/08/15/Be_Careful_Of_MDA.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Wed, 15 Aug 2007 10:56:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2007/08/15/Be_Careful_Of_MDA.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/857066.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2007/08/15/Be_Careful_Of_MDA.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/857066.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/857066.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>以前，我们的开发人员和测试人员有时会发现一些类似下图的异常。 </p>
<p><img src="http://www.cnblogs.com/images/cnblogs_com/Cajon/WindowsLiveWriter/6f1eba875f3e.NETMDA_10A50/clip_image002.jpg" height="283" width="404"> </p>
<p>这些异常的发生往往都是看起来很随机，很难重现的。调用堆栈往往是空的。并且，当程序脱离IDE运行时，都不会发生这些异常。因此，我们经常认为这些异常是IDE的Bug导致。很少在意。(至少我以前是这样) </p>
<p>今天详细的看了一下<a href="http://msdn2.microsoft.com/en-us/library/d21c150d.aspx">MSDN中关于MDA的介绍</a>。发现<strong>这些问题往往都是很重要的和潜在的问题</strong>。比如：PInvokeStackImbalance这个MDA能够帮助我们发现PInvoke的声明有问题。StreamWriterBufferedDataLost这个MDA可以帮助我们发现我们忘记调用StreamWriter.Close()方法。 </p>
<p>因为很多MDA异常的触发都是在GC回收时进行的，因此表现比较随机。较难重现。 </p>
<p>如果你希望自己控制监视哪些MDA异常，可以使用IDE中的Debug-&gt;Exceptions-&gt;Managing Debugging Assistants来选择捕获哪些MDA异常。如下图： </p>
<p><img src="http://www.cnblogs.com/images/cnblogs_com/Cajon/WindowsLiveWriter/6f1eba875f3e.NETMDA_10A50/clip_image004%5B4%5D.jpg" height="256" width="500"></p><img src ="http://www.cnblogs.com/Cajon/aggbug/857066.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42816/" target="_blank">[新闻]传阿里投资淘宝超40亿元 应对百度C2C</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>【点滴】向Sql Express数据库文件中注册Asp.NET 2.0用户管理模块</title><link>http://www.cnblogs.com/Cajon/archive/2007/07/29/ASP_NET_USER_MANAGER_FOR_SQL_SERVER_EXPRESS.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Sun, 29 Jul 2007 06:20:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2007/07/29/ASP_NET_USER_MANAGER_FOR_SQL_SERVER_EXPRESS.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/835377.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2007/07/29/ASP_NET_USER_MANAGER_FOR_SQL_SERVER_EXPRESS.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/835377.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/835377.html</trackback:ping><description><![CDATA[据说<a href="http://www.cnblogs.com/hjf1223/archive/2006/08/27/487890.html">Asp.NET 2.0提供了用户管理的基本框架和实现</a>。按照这个框架可以很容易的实现Web网站的用户管理功能。<br>呵呵，今天想学习一下。<br><br>遇到的第一个问题，就是如何建立Asp.NET用户管理数据库。好在微软提供了一个向导来帮助你完成这个工作。只需要在Visual Studio 2005 Command Line下输入&#8220;<span style="font-weight: bold; font-style: italic;">aspnet_regsql</span>&#8221;即可以启动向导。上面的链接中有比较细致的介绍。<br><br>可惜，我并不想在我的机器上安装Sql Server <img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absmiddle" border="0">.只想使用VS2005自带的Sql Express版。但是，上面的向导中并没有对Express版的支持。<img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emsad.gif" align="absmiddle" border="0">郁闷<br><br>呵呵，微软还是做事很细致的，他为我么提供了命令行的方式。虽然，实现确实很隐晦。不管怎样，下面的代码可以成功的将数据库建立起来。<br><br><fieldset><legend>建立数据库</legend>Type text here)...aspnet_regsql -C "Data Source=.\SQLEXPRESS;Integrated Security=True;User Instance=True" -d "数据库文件路径和全名.mdf" -A all
</fieldset><br>如果你还希望添加Session State的支持，只需要在后面加上&#8220;<span style="font-weight: bold; font-style: italic;">-ssadd</span>&#8221;就可以了。<br>如果你希望从数据库里面清理掉用户管理的支持，只需要将上文中的"<span style="font-weight: bold; font-style: italic;">-A</span>"改为"<span style="font-style: italic;"><span style="font-weight: bold;">-R</span></span>"即可。<span style="font-style: italic;">注意，这里区分大小写。</span><br>当然移除Session State的指令是"<span style="font-style: italic;"><span style="font-weight: bold;">-ssremove</span></span>"<br><br>关于更多的命令行参数，还是各位看官自己查MSDN或运行下面的命令行查看吧。<br><fieldset><legend>查看aspnet_regsql的命令行支持</legend>aspnet_regsql /?
</fieldset><br><br><img src ="http://www.cnblogs.com/Cajon/aggbug/835377.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42815/" target="_blank">[新闻]传雅虎最快本月将宣布收购美国在线</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>也谈博客园的商业化</title><link>http://www.cnblogs.com/Cajon/archive/2007/07/09/811714.html</link><dc:creator>Colin Han</dc:creator><author>Colin Han</author><pubDate>Mon, 09 Jul 2007 12:34:00 GMT</pubDate><guid>http://www.cnblogs.com/Cajon/archive/2007/07/09/811714.html</guid><wfw:comment>http://www.cnblogs.com/Cajon/comments/811714.html</wfw:comment><comments>http://www.cnblogs.com/Cajon/archive/2007/07/09/811714.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/Cajon/comments/commentRss/811714.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/Cajon/services/trackbacks/811714.html</trackback:ping><description><![CDATA[呵呵，对Cnblogs关注的时间很长了，也搭建了自己的技术博客。但是，平心而论，对博客园的贡献还是很小了。<br><br>关于博客园的商业化，谈点自己的想法：<br>首先我想问的是：<span style="font-weight: bold;">为什么博客园需要商业化？</span><br><br>对于这个问题，我觉得可能也只能有两种解释。<br>a. 博客园的<span style="font-weight: bold;">生存受到了威胁</span>，如果不进行商业化，可能就会死掉。<br>b. 有很多<span style="font-weight: bold;">好的想法，好的服务</span>，因为资金的原因无法实现。<br><br>如果不是这两个原因中的一个，我觉得这个问题就不需要讨论了。:-)<br><br>我想，对于这两个问题的解决方案是完全不同的。<br><br><span style="font-weight: bold;">a. 经济问题影响了博客园的生存。</span><br>我不知道Dudu老大是怎样维持博客园的正常运作的。仅仅靠首页上的广告吗？相信Dudu老大对博客园的贡献和他的辛苦是我们每个人都不能比拟的。相信相对于他的付出，他的收入是很微薄的。Dudu老大希望能够将他辛勤的结果转换为对自己相对好的的回报是很正常的想法。<br>如果博客园目前真的遇到了这个问题。我想，商业化中所最需要注意的问题是：&#8220;如何在商业化的过程中确保Dudu对博客园的掌握&#8221;。<br>因为，生存才是商业化的主要目的。我们不能也没有必要追求过高的回报率。只要能够维持正常的运作和生活就可以了。<br>而Dudu对博客园的完全控制，才能够保证将来进行第二轮商业化的过程时不会引入太多的复杂因素。<br>如果希望解决这个问题，我建议在博客园内部寻求资源。比如：提供一些收费的服务。或引入一些赞助机制等。因为我相信，博客园中的大多数人和Dudu的利益是一致的。而大多数企业和我们的利益并不总是一致。因此，我完全反对这个时候引入企业赞助。企业的赞助会影响博客园的中立性，会在将来影响博客园的发展或转型。<br>希望Dudu千万不要在商业化面前迷失了自己。<br><br><span style="font-weight: bold;">b. 没有足够的资源为大家提供更好的服务</span><br>最近两天对于博客园商业化的讨论非常多，但是，在其中我没有看到我们需要提供哪些新的服务为博客园的作者和读者带来更多的价值的内容。<br>如果真的有这样的服务，我想，通过在这些增值服务上进行收费可能是一个解决经济问题的方案。同样，如果我们能够找到很好的服务。寻找VC也就不会很困难了。<br><br>哈哈，说了这么多，把自己想说什么都给忘了。简单来说：<br>1. <span style="font-weight: bold;">不要为了生存而放弃博客园的精神</span>。什么是博客园的精神呢？我想：&#8220;分享、简单、纯洁&#8221;应该是我心目中的博客园的精神。<br>2. <span style="font-weight: bold;">寻找杀手服务</span>，找到它，博客园就可以发展壮大。否则，我觉得不商业化也罢。<br><br>呵呵，我是一个作技术的人。想法简单。某些说