﻿<?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>博客园-小蟒蛇IronPython </title><link>http://ipy.cnblogs.com</link><description>关注IronPython的快乐团队</description><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2010 20:36:25 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2010 20:36:25 GMT</pubDate><ttl>60</ttl><item><title>IronPython 承载和消费WCF服务</title><link>http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html</link><dc:creator>geff zhang</dc:creator><author>geff zhang</author><pubDate>Tue, 26 Jan 2010 12:32:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html</guid><description><![CDATA[<p>阅读: 988 评论: 1 作者: <a href="" target="_blank">geff zhang</a> 发表于 2010-01-26 20:32 <a href="http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html" target="_blank">原文链接</a></p><p><a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/ipy26.html" target="_blank">是开始学习IronPython 的时候了</a>文章里谈到了&#8220;IronPython 2.6提供了新特性clrtype，允许程序员用纯IronPython代码提供property、attribute等CLR类型信息。这样IronPython代码就可以无缝地与Sliverlight、WCF等框架集成。&#8221;我们就用clrtype来看看怎么承载WCF服务和消费WCF服务。WCF的契约需要定义接口，这是目前IronPython 尚未支持的功能，所以我们先用C#定义个一个WCF的契约：</p>
<p>using System; <br />using System.Collections.Generic; <br />using System.ServiceModel; </p>
<p>namespace TestServiceInterface <br />{ <br />&nbsp;&nbsp;&nbsp; /// &lt;summary&gt; <br />&nbsp;&nbsp;&nbsp; /// Description of MyClass. <br />&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt; <br />&nbsp;&nbsp;&nbsp; [ServiceContract]&nbsp; <br />&nbsp;&nbsp;&nbsp; public interface ImyService&nbsp; <br />&nbsp;&nbsp;&nbsp; {&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [OperationContract] <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string GetData(int value);&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; }&nbsp; </p>
<p>}</p>
<p>编译成一个程序集TestServiceInterface.dll, 然后在IronPython中实现WCF服务myWcfService.myService，代码如下：</p>
<p>import clr <br />import clrtype&nbsp; <br />clr.AddReference('System.ServiceModel') <br />clr.AddReference('TestServiceInterface') <br />from TestServiceInterface import ImyService&nbsp; </p>
<p>from System import Console, Uri&nbsp; <br />from System.ServiceModel import (ServiceHost, BasicHttpBinding, ServiceBehaviorAttribute, InstanceContextMode)&nbsp; </p>
<p>ServiceBehavior = clrtype.attribute(ServiceBehaviorAttribute)&nbsp; </p>
<p>class myService(ImyService):&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; __metaclass__ = clrtype.ClrClass&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; _clrnamespace = "myWcfService" </p>
<p>&nbsp;&nbsp;&nbsp; _clrclassattribs = [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]&nbsp; </p>
<p><br />&nbsp;&nbsp;&nbsp; def GetData(self, value):&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return r"IronPython WCF服务: 你的输入内容是: %s" % value&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>sh = ServiceHost(myService()&nbsp; ,Uri("<a href="http://localhost:7000/myWcfService%22" target="_blank">http://localhost:7000/myWcfService%22</a> ) ) </p>
<p>sh.AddServiceEndpoint(&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clr.GetClrType(ImyService),&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BasicHttpBinding(), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "")&nbsp; </p>
<p>sh.Open()&nbsp; </p>
<p>Console.WriteLine("Press &lt;ENTER&gt; to terminate\n")&nbsp; <br />Console.ReadLine()&nbsp; </p>
<p>sh.Close() </p>
<p>这里用到了一个clrtype模块, 代码参加IronPython的Sample工程，可以从这里下载：<a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482" target="_blank">http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482</a> ，第一个例子就是ClrType ，从这里拷贝出来放到我们的py目录下。类myService 必须加一个attribute <em>InstanceContextMode.Single</em> ServiceBehavior 。 </p>
<p>&nbsp;</p>
<p>我们再来写个测试的客户端代码：</p>
<p>import clr&nbsp; </p>
<p>clr.AddReference('System.ServiceModel')&nbsp; </p>
<p>from&nbsp;&nbsp; System import Console <br />import System.ServiceModel&nbsp; </p>
<p>clr.AddReference('TestServiceInterface')&nbsp; </p>
<p>from TestServiceInterface import ImyService&nbsp; </p>
<p>&nbsp;</p>
<p>mycf = System.ServiceModel.ChannelFactory[ImyService](&nbsp; </p>
<p>System.ServiceModel.BasicHttpBinding(),&nbsp; </p>
<p>System.ServiceModel.EndpointAddress("<a href="http://localhost:7000/myWcfService%22))" target="_blank">http://localhost:7000/myWcfService%22))</a></p>
<p>wcfcli = mycf.CreateChannel()&nbsp; </p>
<p>print r"IronPython WCF 服务的返回结果是:\n%s" % wcfcli.GetData(11) </p>
<p>Console.WriteLine("Press &lt;ENTER&gt; to terminate\n")&nbsp; <br />Console.ReadLine()</p>
<p>运行起来可以得到的结果如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/shanyou/WindowsLiveWriter/IronPythonWCF_120CD/image_2.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/shanyou/WindowsLiveWriter/IronPythonWCF_120CD/image_thumb.png" width="751" height="120" /></a> </p>
<p>这样一个基本的WCF服务示例就完成了，示例有个问题是没法使用配置文件来存储WCF的配置信息，只能通过代码方式对WCF服务进行配置。</p>
<p>另外链接几篇IronPython结合Entity Framework的文章，其中也使用到了clrtype模块。</p>
<p><a href="http://www.simonsegal.net/blog/2009/12/31/entity-framework-ironpython-and-podos-can-it-be-done-part-1/" target="_blank">Entity Framework, IronPython and PODO&#8217;s &#8211; Can it be done? - Part 1 </a></p>
<p><a href="http://www.simonsegal.net/blog/2010/01/07/entity-framework-ironpython-and-podos-can-it-be-done-part-2/" target="_blank">Entity Framework, IronPython and PODO&#8217;s &#8211; Can it be done? - Part 2 </a></p>
<p><a href="http://www.simonsegal.net/blog/2010/01/13/entity-framework-ironpython-and-podos-can-it-be-done-part-3/" target="_blank">Entity Framework, IronPython and PODO&#8217;s &#8211; Can it be done? - Part 3 </a></p>
<p><a href="http://www.simonsegal.net/blog/2010/01/14/entity-framework-ironpython-and-podos-can-it-be-done-part-4/" target="_blank">Entity Framework, IronPython and PODO&#8217;s &#8211; Can it be done? - Part 4 </a></p><img src="aggbug/1656973.html?type=0" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>是开始学习IronPython 的时候了</title><link>http://www.cnblogs.com/shanyou/archive/2009/12/22/ipy26.html</link><dc:creator>geff zhang</dc:creator><author>geff zhang</author><pubDate>Tue, 22 Dec 2009 05:09:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2009/12/22/ipy26.html</guid><description><![CDATA[<p>阅读: 1823 评论: 3 作者: <a href="" target="_blank">geff zhang</a> 发表于 2009-12-22 13:09 <a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/ipy26.html" target="_blank">原文链接</a></p><p><a href="http://blogs.msdn.com/dinoviehland/default.aspx" target="_blank">Dino's Blog</a> 上写一篇文章介绍了<a href="http://blogs.msdn.com/dinoviehland/archive/2009/12/11/ironpython-2-6-released.aspx" target="_blank">IronPython 2.6的Final版本已经发布</a>。IronPython就是优雅的python编程语言和强大的.NET平台的有机结合, IronPython 2.6将完全与CPython 2.6兼容。可以从codeplex下载：<a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482" target="_blank">http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12482</a>，下载的安装程序包含了二进制文件、Python标准程序库、用于Silverlight的IronPython和一个教程。此外，还有一个成为Pyc.py的工具，该工具可以把IronPython应用程序编译成二进制文件。Ipy.exe可以用来执行IronPython程序，对于熟悉Python语言及探索.NET程序集来说非常有用。<a href="http://ironpython.net/" target="_blank">http://ironpython.net/</a>有个用Silverlight开发的Web版本的ipy工具<a href="http://ironpython.net/try/" target="_blank">http://ironpython.net/try/</a> 。</p>
<p>IronPython是流行的程序设计语言Python通向.NET framework的一个端口。微软公司对于.NET framework的IronPython和动态语言非常关注。微软公司已经在各种项目中提供了对IronPython的支持。</p>
<p>IronPython已经很好的集成到了.NET framework中，Python语言中的字符串对应于.NET的字符串对象，并且Python语言中对应的方法，在IronPython中也都提供了。其它数据类型也是一样。</p>
<p><a href="http://channel9.msdn.com/" target="_blank">MSDN Channel9</a>发布了一段非常精彩的<a href="http://channel9.msdn.com/posts/martinesmann/Pumping-Iron-Dynamic-Languages-on-NET/" target="_blank">演讲</a>，其内容是IronPython团队的Harry Pierson评论.NET平台上动态语言的发展。</p>
<p>Jim Hugunin是IronPython（也是Jython）的创造者。在构造IronPython的过程中，他发现CLR（Common Language Runtime）对动态语言提供了很好的支持，同时也发现了一些技术问题。为此，他和CLR团队进行了深入的交流。最终，他决定加入微软，加入CLR团队，拟也许注意到Jim Hugunin并不是IronPython得开发者了，而是在构造更适合动态语言的CLR。他们的工作成果之一就是DLR（Dynamic Language Runtime）。</p>
<p>DLR构建在CLR之上，提供了一批服务和API，使得语言开发者能够容易地构造编程语言。它不但是IronPython 2.x的基础，也是C# 4.0的基础。C# 4.0提供了dynamic关键字，可以实现运行时的结构一致性语义（即duck typing）。从语句表达，到底层实现，C#已经完全动态化，动态语义已经渗入其机理。可见，DLR不但打通了IronPython与C#交互的关键，也必将影响到.NET平台上的所有开发者。</p>
<p>IronPython与DLR是共生关系：CLR团队用IronPython来驱动DLR的开发，DLR的开发成果又反过来支持IronPython的进一步演化。这也表明，IronPython将受到微软的持续支持。也许有人会问：既然C# 4.0已经动态化，那么为什么还需要掌握一种&#8220;真正&#8221;的动态语言呢？Harry Pierson的回答是：用合适的工具做事（choose the right tool for the job）。Harry曾经是C#最早一批的开发者和使用者，现在是IronPython团队的程序经理。与《<a href="http://www.ironpythoninaction.com/" target="_blank">IronPython in Action</a>》的作者Michael Foord相似，他很擅长也很喜欢C#，同时也非常热爱IronPython。</p>
<p>抱定一种统一语言不放的年代就快结束了，我们正在进入一个专业细分的新时代，函数式语言更擅长并发（F#已经集成到Visual Studio 2010），动态语言更擅长表达领域模型和业务逻辑。将这些语言都聚合在一个统一的平台上（.NET或Java），将为开发者提供更丰富的工具箱：&#8220;一方面选择使用针对当前工作的最佳工具，另一方面发挥底层平台的健壮性与资源丰富的优势&#8221;。</p>
<p>如《<a href="http://www.china-pub.com/195760&amp;ref=ps" target="_blank">Learning Python</a>》所言：&#8220;无论是短期策略任务（测试或系统管理），还是长期战略上的产品开发，Python已经被证明它是无所不能的&#8221;。而Python 2.6的一致性、简洁性、兼容性也受到广泛认同。因此，IronPython 2.6的语言成熟度很高，能够用简洁的代码表达丰富的语义。</p>
<p>IronPython 2.6，它为程序员提供了什么优势呢？</p>
<p>首先，它的语法与Python 2.6兼容。第二，IronPython 2.6在动态语言与CLR集成上有重大突破。IronPython 2.6提供了新特性clrtype，允许程序员用纯IronPython代码提供property、attribute等CLR类型信息。这样IronPython代码就可以无缝地与Sliverlight、WCF等框架集成。相关技术细节可以参考Harry的系列文章。第三、开发环境对于语言的成功也至关重要，Visual Studio集成是必不可少的。Harry在他的<a href="http://devhawk.net/2009/09/28/IronPython+Post+26+Roadmap.aspx" target="_blank">Blog</a>中提到，在IronPython 2.6正式版发布后，他们会考虑Visual Studio Integration和IronPython 3.x。从Harry的演讲可知，IronPython不会进入Visual Studio 2010 RTM（2010年3月以后，微软刚刚宣布了推迟发布Visual Studio 2010 RTM），Visual Studio 2010 SDK会携带一个IronPython 2.6集成的例子。</p>
<p>&nbsp;</p>
<p>PDC2009相关Session：</p>
<p><a href="http://microsoftpdc.com/Sessions/FT30" target="_blank"></a><a href="http://microsoftpdc.com/Sessions/FT30" target="_blank">Using Dynamic Languages to Build Scriptable&nbsp;Applications</a><a href="http://microsoftpdc.com/Sessions/FT30" target="_blank"></a></p>
<p><a href="http://microsoftpdc.com/Sessions/FT31" target="_blank">Dynamic Binding in C#&nbsp;4</a></p><img src="aggbug/1629692.html?type=0" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/ipy26.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/ipy26.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Python:FriendFeed的Tornado Web Server</title><link>http://www.cnblogs.com/shanyou/archive/2009/09/12/1565104.html</link><dc:creator>geff zhang</dc:creator><author>geff zhang</author><pubDate>Fri, 11 Sep 2009 23:05:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2009/09/12/1565104.html</guid><description><![CDATA[<p>阅读: 1164 评论: 2 作者: <a href="" target="_blank">geff zhang</a> 发表于 2009-09-12 07:05 <a href="http://www.cnblogs.com/shanyou/archive/2009/09/12/1565104.html" target="_blank">原文链接</a></p><p>代码很简单，不到5k行。但是思路挺好的，改成non-blocking了之后效率就是能提高不少，特别是考虑到现代的web app都需要和其他的HTTP服务器通信，blocking的代价太大了。</p>
<p>Tornado is an open source version of the scalable, non-blocking web server and tools that power FriendFeed. The FriendFeed application is written using a web framework that looks a bit like web.py or Google's webapp, but with additional tools and optimizations to take advantage of the underlying non-blocking infrastructure. <br />The framework is distinct from most mainstream web server frameworks (and certainly most Python frameworks) because it is non-blocking and reasonably fast. Because it is non-blocking and uses epoll, it can handle thousands of simultaneous standing connections, which means it is ideal for real-time web services. We built the web server specifically to handle FriendFeed's real-time features &#8212; every active user of FriendFeed maintains an open connection to the FriendFeed servers. (For more information on scaling servers to support thousands of clients, see The C10K problem.) <br />See the Tornado documentation for a detailed walkthrough of the framework.</p>
<p><strong>Tornado: Facebook Releases Python Framework as Open Source</strong></p>
<p><a title="http://www.linux-magazine.com/Online/News/Tornado-Facebook-Releases-Python-Framework-as-Open-Source" href="http://www.linux-magazine.com/Online/News/Tornado-Facebook-Releases-Python-Framework-as-Open-Source">http://www.linux-magazine.com/Online/News/Tornado-Facebook-Releases-Python-Framework-as-Open-Source</a></p><img src="aggbug/1565104.html?type=0" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/shanyou/archive/2009/09/12/1565104.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2009/09/12/1565104.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Gestalt - 在浏览器里用 python/ruby 写客户端脚本</title><link>http://www.cnblogs.com/RChen/archive/2009/07/24/1530040.html</link><dc:creator>木野狐(Neil Chen)</dc:creator><author>木野狐(Neil Chen)</author><pubDate>Fri, 24 Jul 2009 03:41:00 GMT</pubDate><guid>http://www.cnblogs.com/RChen/archive/2009/07/24/1530040.html</guid><description><![CDATA[<p>阅读: 718 评论: 2 作者: <a href="" target="_blank">木野狐(Neil Chen)</a> 发表于 2009-07-24 11:41 <a href="http://www.cnblogs.com/RChen/archive/2009/07/24/1530040.html" target="_blank">原文链接</a></p><div>Gestalt 是 Mix Online Lab 创造出来的一个框架，利用它我们可以在浏览器里用 python/ruby 写脚本来操纵 DHTML 的各种对象，其作用就跟 javascript 类似。<br />一个例子：<br />
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="javascript"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="gestalt.js"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;<br /></span><span style="background-color: #f5f5f5; color: #000000">&lt;</span><span style="background-color: #f5f5f5; color: #000000">div&nbsp;id</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">message</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">&gt;&lt;</span><span style="background-color: #f5f5f5; color: #000000">/</span><span style="background-color: #f5f5f5; color: #000000">div&gt;<br />&lt;script&nbsp;language="ruby"&gt;&nbsp;&nbsp;<br />document.message.innerHTML&nbsp;=&nbsp;"Hello,&nbsp;World!"<br />&lt;</span><span style="background-color: #f5f5f5; color: #000000">/</span><span style="background-color: #f5f5f5; color: #000000">script</span><span style="background-color: #f5f5f5; color: #000000">&gt;</span></div><br />还可以将脚本写在独立的文件中，像这样：<br />
<div id="LC1" class="line"><span class="nt">
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">language</span><span style="color: #0000ff">="ruby"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="application.rb"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span></div><br />其内部实现是利用了 Silverlight 中实现的 DLR 引擎对 IronPython /IronRuby 的支持，不过，这个东西目前还有一个很大的问题，就是不能引用现有的 python/ruby 模块（类似 import, require 的语言特性）。<br /><br />详情参考：<br /><a href="http://blog.jimmy.schementi.com/2009/07/gestalt-ruby-and-python-in-browser.html">http://blog.jimmy.schementi.com/2009/07/gestalt-ruby-and-python-in-browser.html</a><br /><a href="http://visitmix.com/labs/gestalt/downloads/">http://visitmix.com/labs/gestalt/downloads/</a><br /><br /></span></div></div><img src="aggbug/1530040.html?type=0" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/RChen/archive/2009/07/24/1530040.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/RChen/archive/2009/07/24/1530040.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Visual Studio 2010 Beta 1探索笔记（2）：动态特性与IronPython</title><link>http://www.cnblogs.com/redmoon/archive/2009/05/21/1486205.html</link><dc:creator>redmoon</dc:creator><author>redmoon</author><pubDate>Thu, 21 May 2009 04:44:00 GMT</pubDate><guid>http://www.cnblogs.com/redmoon/archive/2009/05/21/1486205.html</guid><description><![CDATA[<p>阅读: 2503 评论: 5 作者: <a href="" target="_blank">redmoon</a> 发表于 2009-05-21 12:44 <a href="http://www.cnblogs.com/redmoon/archive/2009/05/21/1486205.html" target="_blank">原文链接</a></p><p>在.NET 4.0中加入的一个重要特性就是动态特性，即所谓的dynamic关键字。更多的信息可以参看MSDN的帮助，或阅读如下InfoQ文章：</p>
<p>《<a href="http://www.infoq.com/cn/news/2009/01/Future-.NET-Languages">微软.NET编程语言的未来</a>》，《<a href="http://www.infoq.com/cn/news/2008/10/DLR-NET4">.NET和动态语言</a>》。</p>
<p>微软今早发布了<a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27320">2.6 CTP for .NET 4.0 Beta 1</a>，要完成在.NET 4.0中调用IronPython的工作，需要如下步骤：</p>
<ol>
    <li>安装Visual Studio 2010 Beta 1</li>
    <li>从<a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27320">http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27320</a>安装IronPython.msi</li>
    <li>跟随这个博客文章，进行操作：<a title="http://blogs.msdn.com/vbteam/archive/2008/12/17/walkthrough-dynamic-programming-in-visual-basic-10-0-and-c-4-0-lisa-feigenbaum.aspx" href="http://blogs.msdn.com/vbteam/archive/2008/12/17/walkthrough-dynamic-programming-in-visual-basic-10-0-and-c-4-0-lisa-feigenbaum.aspx">http://blogs.msdn.com/vbteam/archive/2008/12/17/walkthrough-dynamic-programming-in-visual-basic-10-0-and-c-4-0-lisa-feigenbaum.aspx</a></li>
</ol>
<p>下面是我的一些探索体会：</p>
<ol>
    <li>搭建环境还比较麻烦，要从<a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27320">2.6 CTP for .NET 4.0 Beta 1</a>的安装目录中添加IronPython.dll, IronPython.Modules.dll, and Microsoft.Scripting.dll程序集。理论上Microsoft.Scripting.dll作为DLR的主程序集应该直接包含到.NET 4.0中，目前似乎还是分开的。</li>
    <li>另外由于py文件要调用一些Python模块，所以还必须把<a href="http://ironpython.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27320">2.6 CTP for .NET 4.0 Beta 1</a>的安装目录中的Lib目录Copy到Debug中</li>
    <li>在Debug Run模式下，似乎无法载入py文件，也不出错，就一直停在那里，在Run without debug和直接运行的时候，就能正常运行。<strong>这应该是一个Bug，大家要注意</strong>。</li>
    <li>dynamic可以代替var关键字使用，当然这样的话，变量就无法被推导，也就没有智能提示。</li>
</ol>
<p>下一篇，我打算体验一下动态特性和Silverlight的交互，敬请期待！</p>
<p>本笔记的源代码如下(不要用迅雷等下载)：<a href="http://cid-f73516baeac50992.skydrive.live.com/self.aspx/SharedCode/IronPython%7C_Dynamic.zip">http://cid-f73516baeac50992.skydrive.live.com/self.aspx/SharedCode/IronPython%7C_Dynamic.zip</a></p>
<img src="aggbug/1486205.html?type=0" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/redmoon/archive/2009/05/21/1486205.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/redmoon/archive/2009/05/21/1486205.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>使用IronPython检测ASP.NET程序状况（下）</title><link>http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/ironpython-aspnet-request-sampling.html</link><dc:creator>Jeffrey Zhao</dc:creator><author>Jeffrey Zhao</author><pubDate>Wed, 25 Mar 2009 01:03:00 GMT</pubDate><guid>http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/ironpython-aspnet-request-sampling.html</guid><description><![CDATA[<p>阅读: 24812 评论: 21 作者: <a href="" target="_blank">Jeffrey Zhao</a> 发表于 2009-03-25 09:03 <a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/ironpython-aspnet-request-sampling.html" target="_blank">原文链接</a></p><p>在<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/23/IronPython-AspNet-Diagnostics.html">上一篇</a>文章中，我们在一个请求中执行了IronPython代码，通过这个方法我们可以轻松地的检查系统运行的状态，或对系统进行一些简单修改。但是这种做法只能检查系统在当前时刻的状态，在很多情况下，我们需要对系统的请求进行一段时间的采样。对于简单的数据（例如每秒执行的请求数量，请求时间），我们可以通过查看Performance Monitor中相关的计数器来获得一些概要的数据。但是，如果我们需要获取一些系统的详细状态，甚至是需要根据需要进行动态改变的自定义需求，则势必要深入到系统内部进行数据采集。因此，我们可能需要让代码执行“一段时间”，并将直接结果进行汇总输出。</p> <p>让代码执行一段时间不难，简单地使用Thread.Sleep便可，也不会造成什么性能或吞吐量上的损失。关键就在于，在代码停留的这“一段时间”内，我们使用什么样的做法来采集数据。这时候，老赵脑海中立即浮现出的便是HttpModule般监听请求管道（Pipeline）中的各式事件。于是立马写出以下的代码（在前文的示例基础上进行修改）：</p><pre class="code"><span style="color: blue">protected void </span>btnExecute_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">EventArgs </span>e)
{
    <span style="color: #2b91af">ScriptEngine </span>engine = <span style="color: #2b91af">Python</span>.CreateEngine();
    <span style="color: blue">var </span>scope = engine.CreateScope();
    <span style="color: blue">var </span>script = engine.CreateScriptSourceFromString(
        <span style="color: blue">this</span>.txtCode.Text, <span style="color: #2b91af">SourceCodeKind</span>.Statements);
    script.Execute(scope);

    <span style="color: #2b91af">TextWriter </span>writer = <span style="color: blue">new </span><span style="color: #2b91af">StringWriter</span>();
    scope.SetVariable(<span style="color: #a31515">"logger"</span>, writer);

    <span style="color: #2b91af">Action</span>&lt;<span style="color: #2b91af">HttpContext</span>&gt; traceRequest;
    <span style="color: blue">if </span>(scope.TryGetVariable&lt;<span style="color: #2b91af">Action</span>&lt;<span style="color: #2b91af">HttpContext</span>&gt;&gt;(<span style="color: #a31515">"traceRequest"</span>, <span style="color: blue">out </span>traceRequest))
    {
        <span style="color: #2b91af">Action </span>endTraceRequests;
        scope.TryGetVariable&lt;<span style="color: #2b91af">Action</span>&gt;(<span style="color: #a31515">"endTraceRequests"</span>, <span style="color: blue">out </span>endTraceRequests);

        <span style="color: blue">int </span>waitTime;
        <span style="color: blue">if </span>(!scope.TryGetVariable&lt;<span style="color: blue">int</span>&gt;(<span style="color: #a31515">"waitTime"</span>, <span style="color: blue">out </span>waitTime))
        {
            waitTime = 10000;
        }

        <span style="color: blue">this</span>.TraceRequests(traceRequest, waitTime, endTraceRequests);
    }

    <span style="color: blue">this</span>.txtOutput.Text = writer.ToString();
}

<span style="color: blue">private void </span>TraceRequests(<span style="color: #2b91af">Action</span>&lt;<span style="color: #2b91af">HttpContext</span>&gt; traceRequest, <span style="color: blue">int </span>waitTime, <span style="color: #2b91af">Action</span> endTraceRequests)
{
    <span style="color: #2b91af">EventHandler </span>handler = (sender, e) =&gt;
    {
        <span style="color: blue">try
        </span>{
            traceRequest((sender <span style="color: blue">as </span><span style="color: #2b91af">HttpApplication</span>).Context);
        }
        <span style="color: blue">catch </span>{ }
    };

    <span style="color: blue">this</span>.Context.ApplicationInstance.BeginRequest += handler;
    <span style="color: #2b91af">Thread</span>.Sleep(waitTime);
    <span style="color: blue">this</span>.Context.ApplicationInstance.BeginRequest -= handler;

    <span style="color: blue">if </span>(endTraceRequests != <span style="color: blue">null</span>) endTraceRequests();
}
</pre>
<p>再编译了IronPython代码之后，我们会设法获取其中的traceRequest和endTraceRequests函数，前者用于“记录每个请求”，而后者用于采样最后的“聚合”。此外，还会设法从代码中获取等待时间waitTime。然后，使用TraceRequest方法开始对当前请求进行采样。具体做法为监听当前Application的BeginRequest事件，并在每次获得请求时调用traceRequest委托进行“记录”。在等待时间过后，自然将委托从BeginRequest事件中剥离。最后，再通过endTraceRequests函数进行聚合输出。</p>
<p>代码逻辑很清晰，但可惜的是，上面这段代码不能生效。具体原因不明，可能是ASP.NET对这方面进行了限制，使得我们无法在HttpModule之外为请求管道动态添加事件处理函数（存疑，求证）。对此我们只能进行让步。不过，既然ASP.NET允许HttpModule监听管道事件，那么我们不如事先准备一个HttpModule监听各种事件，并且在合适的时候把这一事件转发给IronPython函数。我们这里还是以BeginRequest事件为例：</p><pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">IronPythonTraceModule </span>: <span style="color: #2b91af">IHttpModule
</span>{
    <span style="color: blue">private class </span><span style="color: #2b91af">TraceRequestEventArgs </span>: <span style="color: #2b91af">EventArgs
    </span>{
        <span style="color: blue">public </span>TraceRequestEventArgs(<span style="color: #2b91af">HttpContext </span>context)
        {
            <span style="color: blue">this</span>.HttpContext = context;
        }

        <span style="color: blue">public </span><span style="color: #2b91af">HttpContext </span>HttpContext { <span style="color: blue">get</span>; <span style="color: blue">private set</span>; }
    }

    <span style="color: blue">public void </span>Dispose() { }

    <span style="color: blue">public void </span>Init(<span style="color: #2b91af">HttpApplication </span>context)
    {
        context.BeginRequest += <span style="color: blue">new </span><span style="color: #2b91af">EventHandler</span>(OnBeginRequest);
    }

    <span style="color: blue">static void </span>OnBeginRequest(<span style="color: blue">object </span>sender, <span style="color: #2b91af">EventArgs </span>e)
    {
        <span style="color: blue">var </span>traceRequest = <span style="color: #2b91af">IronPythonTraceModule</span>.TraceRequest;
        <span style="color: blue">if </span>(traceRequest != <span style="color: blue">null</span>)
        {
            <span style="color: blue">var </span>context = (sender <span style="color: blue">as </span><span style="color: #2b91af">HttpApplication</span>).Context;
            traceRequest(<span style="color: blue">null</span>, <span style="color: blue">new </span><span style="color: #2b91af">TraceRequestEventArgs</span>(context));
        }
    }

    <span style="color: blue">private static event </span><span style="color: #2b91af">EventHandler</span>&lt;<span style="color: #2b91af">TraceRequestEventArgs</span>&gt; TraceRequest;

    <span style="color: blue">public static void </span>TraceRequests(
        <span style="color: #2b91af">Action</span>&lt;<span style="color: #2b91af">HttpContext</span>&gt; traceRequest,
        <span style="color: #2b91af">Action </span>endTraceRequests,
        <span style="color: blue">int </span>milliseconds)
    {
        <span style="color: #2b91af">EventHandler</span>&lt;<span style="color: #2b91af">TraceRequestEventArgs</span>&gt; handler = (sender, e) =&gt;
        {
            <span style="color: blue">try
            </span>{
                traceRequest(e.HttpContext);
            }
            <span style="color: blue">catch </span>{ }
        };

        <span style="color: #2b91af">IronPythonTraceModule</span>.TraceRequest += handler;
        <span style="color: #2b91af">Thread</span>.Sleep(milliseconds);
        <span style="color: #2b91af">IronPythonTraceModule</span>.TraceRequest -= handler;

        <span style="color: blue">if </span>(endTraceRequests != <span style="color: blue">null</span>) endTraceRequests();
    }
}
</pre>
<p>IronPythonTraceModule需要放入应用程序中，它时刻对请求管道的BeginRequest进行监听，只是在合适的时候才会发起TraceRequest静态事件（显然这并不会对系统性能造成什么影响）。Module包函一个静态的TraceRequests方法，这便是给外部调用的接口。可以发现这段代码和之前的TraceRequests方法非常接近，唯一不同的只是动态添加/删除处理函数的事件是IronPythonTraceModule.TraceRequest，而不是HttpApplication.BeginRequest。于是，原来的代码也需要做一定修改：</p><pre class="code"><span style="color: blue">protected void </span>btnExecute_Click(<span style="color: blue">object </span>sender, <span style="color: #2b91af">EventArgs </span>e)
{
    ...

    <span style="color: #2b91af">Action</span>&lt;<span style="color: #2b91af">HttpContext</span>&gt; traceRequest;
    <span style="color: blue">if </span>(scope.TryGetVariable&lt;<span style="color: #2b91af">Action</span>&lt;<span style="color: #2b91af">HttpContext</span>&gt;&gt;(<span style="color: #a31515">"traceRequest"</span>, <span style="color: blue">out </span>traceRequest))
    {
        <span style="color: #2b91af">Action </span>endTraceRequests;
        scope.TryGetVariable&lt;<span style="color: #2b91af">Action</span>&gt;(<span style="color: #a31515">"endTraceRequests"</span>, <span style="color: blue">out </span>endTraceRequests);

        <span style="color: blue">int </span>waitTime;
        <span style="color: blue">if </span>(!scope.TryGetVariable&lt;<span style="color: blue">int</span>&gt;(<span style="color: #a31515">"waitTime"</span>, <span style="color: blue">out </span>waitTime))
        {
            waitTime = 10000;
        }

        <span style="color: green">// 以下代码有所修改</span>
        <span style="color: #2b91af">IronPythonTraceModule</span>.TraceRequests(traceRequest, endTraceRequests, waitTime);
    }

    <span style="color: blue">this</span>.txtOutput.Text = writer.ToString();
}
</pre>
<p>现在我们进行一番测试，简单地检测一下5秒钟内收到 了多少请求：</p>
<a href="http://jeffreyzhao.cnblogs.com/images/cnblogs_com/jeffreyzhao/ironpython-aspnet-diagnostics/2.jpg" target="_blank"><img src="http://jeffreyzhao.cnblogs.com/images/cnblogs_com/jeffreyzhao/ironpython-aspnet-diagnostics/2.jpg" width="350"></a>
<p>使用自己的Module进行处理还有其他一些好处，比如可以提供更好的控制。事实上，目前文章里的解决方案有一些缺陷，并且肯定无法完全满足真实需求。不过我们完全可以对目前的做法进行改进，例如：</p>
<ul>
<li>保证代码执行的线程安全，包括事件添加时和traceRequest函数执行时。 
<li>提供“采样特性”，而不是对每个请求都使用traceRequest函数进行处理。 
<li>将Logger放入公用的空间，并在程序代码中植入检查功能，这样便可以得知当前系统中每个功能的执行时间（这就是Profiler的功能，不是吗？）。</li></ul>
<p>不过，除了应对前一篇文章中所提到的负载均衡环境下的问题之外，这个解决方案还有另一个较为重要的情况需要特殊对待。如果使用目前的做法，每次采样都是通过一个请求进行的，所以它并不会在在请求队列阻塞时立即执行，但是采样的常见场景便是在队列阻塞时间检查状况，这显然形成了一个矛盾。不过要解决这个问题并非难事，只要采样不要通过IIS即可。例如您使用普通Socket，或“偷偷懒”使用WCF的TcpBinding进行采样便可——只要和被检查的应用程序在同一进程（即w3wp.exe，还有人用IIS5 吗？）中，便可以使用任何方式进行通信。</p>
<p>改变、探索的过程，其实都是在追求一种编程的美感。老赵喜欢“不拘一格”，只要是有价值的都会去设法尝试一番，探索的过程会遇到大量问题，解决问题后又能带来成就感以及新的感受。因为美感和成就感，所以产生乐趣，因为乐趣才有源源不断地动力。因为有这样的切身体会，所以在这里也建议大家，不妨放开思路，海纳百川。我们可以获得和想到的东西，远比预料中来的丰富。</p>
<p>&nbsp;</p>
<p>相关文章：<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/23/IronPython-AspNet-Diagnostics.html">使用IronPython检测ASP.NET程序状况（上）</a></p><img src="aggbug/1419250.html?type=0" width="1" height="1" alt=""/><p>评论: 21　<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/ironpython-aspnet-request-sampling.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/ironpython-aspnet-request-sampling.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Ironclad</title><link>http://www.cnblogs.com/shanyou/archive/2009/02/18/1393517.html</link><dc:creator>geff zhang</dc:creator><author>geff zhang</author><pubDate>Wed, 18 Feb 2009 14:26:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2009/02/18/1393517.html</guid><description><![CDATA[<p>阅读: 894 评论: 0 作者: <a href="" target="_blank">geff zhang</a> 发表于 2009-02-18 22:26 <a href="http://www.cnblogs.com/shanyou/archive/2009/02/18/1393517.html" target="_blank">原文链接</a></p><P>Ironclad是一个开源项目,目的是使得IronPython可以使用CPython C Extensions。虽然IronPython可以使用大部分的Python库。这个库是由Resolver Systems开发的，使用<A href="http://www.opensource.org/licenses/mit-license.php">MIT License</A>协议。</P>
<P>项目地址：<A title=http://code.google.com/p/ironclad/ href="http://code.google.com/p/ironclad/">http://code.google.com/p/ironclad/</A></P><img src="aggbug/1393517.html?type=0" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/shanyou/archive/2009/02/18/1393517.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2009/02/18/1393517.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IronPython 2.0 发布了</title><link>http://www.cnblogs.com/shanyou/archive/2008/12/15/1355258.html</link><dc:creator>geff zhang</dc:creator><author>geff zhang</author><pubDate>Mon, 15 Dec 2008 05:19:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2008/12/15/1355258.html</guid><description><![CDATA[<p>阅读: 1569 评论: 0 作者: <a href="" target="_blank">geff zhang</a> 发表于 2008-12-15 13:19 <a href="http://www.cnblogs.com/shanyou/archive/2008/12/15/1355258.html" target="_blank">原文链接</a></p><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DLR团队终于发布了 IronPython 2.0 ，IronPython 2.0完全基于Dynamic Language Runtime (DLR). DLR允许多个动态语言在系统类型层面实现互操作。这个版本修复大概500多个bug，有453个来自codeplex社区的反馈。热烈祝贺开发团队发布了这一个重大的里程碑版本。可以到codeplex上去下载，下面是一些重要的链接：</P>
<UL>
<LI>项目codeplex站点<A title=http://www.codeplex.com/IronPython href="http://www.codeplex.com/IronPython">http://www.codeplex.com/IronPython</A> 
<LI>下载地址 <A title=http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=8365 href="http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=8365">http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=8365</A> 
<LI>发布说明：<A title=http://www.codeplex.com/IronPython/Wiki/View.aspx?title=v2.0.0%20Release%20Notes&amp;referringTitle=Home href="http://www.codeplex.com/IronPython/Wiki/View.aspx?title=v2.0.0%20Release%20Notes&amp;referringTitle=Home">http://www.codeplex.com/IronPython/Wiki/View.aspx?title=v2.0.0%20Release%20Notes&amp;referringTitle=Home</A> 
<LI>IronPython Cookbook: <A href="http://www.ironpython.info/index.php/Main_Page" target=_new>http://www.ironpython.info/index.php/Main_Page</A> </LI></UL>
<P>下面是IronPython 2.0一些说明：</P>
<UL>
<LI>要求安装.NET 2.0 SP1 
<LI>和CPython 2.5 兼容，有几个不同的地方，参看<A href="http://www.codeplex.com/IronPython/Wiki/View.aspx?title=IPy2.0.xCPyDifferences&amp;referringTitle=Differences">Differences between IronPython 2.0.x and CPython 2.5.2</A> 
<LI>性能良好: 比Python 2.5 快1.8 倍 ，使用 <A href="http://zope.stackless.com/wiki/PyStone">PyStone</A> 基准测试的 
<LI>可以调用大部分的标准 Python 库和所有.NET 库 </LI></UL>
<DIV id=psum><I><A style="COLOR: #000; TEXT-DECORATION: none" href="http://code.google.com/p/ironpython/">Example IronPython code. Including Silverlight and embedding IronPython and C#.</A></I> </DIV>
<P><A href="http://code.google.com/p/ironpython/">http://code.google.com/p/ironpython/</A></P><img src="aggbug/1355258.html?type=0" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/shanyou/archive/2008/12/15/1355258.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2008/12/15/1355258.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>动态语言运行时(DLR)官网</title><link>http://www.cnblogs.com/shanyou/archive/2008/11/02/1325005.html</link><dc:creator>geff zhang</dc:creator><author>geff zhang</author><pubDate>Sun, 02 Nov 2008 12:34:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2008/11/02/1325005.html</guid><description><![CDATA[<p>阅读: 1151 评论: 0 作者: <a href="" target="_blank">geff zhang</a> 发表于 2008-11-02 20:34 <a href="http://www.cnblogs.com/shanyou/archive/2008/11/02/1325005.html" target="_blank">原文链接</a></p><p>目前，DLR的源代码只能从<a href="http://www.codeplex.com/IronPython">IronPython</a>、<a href="http://www.ironruby.net/">IronRuby</a>或者<a href="http://www.codeplex.com/sdlsdk">Silverlight Dynamic Languages SDK</a>获得。从11月份开始，DLR将拥有自己的CodePlex站点。这个站点将提供IronPython、IronRuby和DLR的源码和文档的一站式服务。计划在11月内发布DLR v0.9，在IronPython 2.0的时候正式发布。动态语言运行时(DLR)官网地址：<a href="http://www.codeplex.com/dlr">Dynamic Language Runtime</a></p>
  <img src="aggbug/1325005.html?type=0" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/shanyou/archive/2008/11/02/1325005.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2008/11/02/1325005.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><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><description><![CDATA[<p>阅读: 2295 评论: 9 作者: <a href="" target="_blank">Colin Han</a> 发表于 2008-10-06 10:08 <a href="http://www.cnblogs.com/Cajon/archive/2008/10/06/use_extensiontypeattribute_to_extend_clr_object_ironpython.html" target="_blank">原文链接</a></p><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/25/support_ironpython_slice_in_dotnet.html">前面的两节</a>中， 我们在一个普通对象和一个Collection上实现了几个<a target="_blank" href="http://msdn.microsoft.com/zh-cn/library/system.runtime.compilerservices.specialnameattribute%28VS.85%29.aspx">SpecialName</a>方法。从而使得我们的业务对象能够支持一些动态语言的特性。比如：支持动态添加删除属性和支持切片。但是：</p>
<ul>
    <li>有些时候，我们不希望在非动态语言环境中看到这些对象。</li>
    <li>有些时候，我们不希望我们的业务对象依赖于Microsoft.Script.dll这个奇怪的Assembly</li>
    <li>有些时候，我们可能根据我们的业务需要，让一个系统对象（比如：System.Collections.Generic.Dictionary&lt;TKey, TValue&gt;)能够能够支持一些特别的操作。</li>
    <li>有些时候，我们的用户就是很变态<img src="http://www.cnblogs.com/Emoticons/msn/wink_smile.gif" alt="" /> （也许你还有一些变态的要求，不防在留言中提出。我们一起讨论，看有没有合适的解）<br />
    </li>
</ul>
<p><strong>我们先来看一个微软的例子</strong></p>
<p><a target="_blank" href="http://quickstarts.asp.net/Futures/default.aspx">Asp.NET Futures</a>是微软新近发布的一个组件包，其中包含了ASP.NET对DLR的支持部分。基于这个组件包，你可以使用IronPython或Managed JScript开发ASP.NET应用。<br />
</p>
<p>Python语言秉承的信条是&#8220;简洁的优于复杂的// TODO:&#8221;，因此，为了简化开发人员的工作，ASP.NET Futures中也包含了一些DLR友好的对象。比如下面的两段代码。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;C#&nbsp;Code</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;myValue&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Request.QueryString[</span><span style="color: #800000;">"</span><span style="color: #800000;">MyValue</span><span style="color: #800000;">"</span><span style="color: #000000;">];</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: #008000;">#</span><span style="color: #008000;">&nbsp;Python&nbsp;Code</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">myVar&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Request.MyValue</span></div>
<p> </p>
<p>很显然，Python代码比起C#代码简单了不少。（如果你实际使用一下IronPython，你会发现Python语言确实使得代码更加精炼，开发更加快速，只是我现在还不确定，调试的难度有多高）。</p>
<p>其实，上面的功能实现起来很简单。只需要在HttpRequest类型上添加两个方法就可以实现。如下：</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;System.Web.UI<br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #000000;"><img id="Codehighlighter1_24_375_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_24_375_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_24_375_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_24_375_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_24_375_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_24_375_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_24_375_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_24_375_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_24_375_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_24_375_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;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HttpRequest<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_55_373_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_373_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_55_373_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_373_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_55_373_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_55_373_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_55_373_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_55_373_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;</span><span id="Codehighlighter1_55_373_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_373_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;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;其它实现逻辑</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;6</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;[SpecialName]<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;IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SymbolId</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetMemberNames()<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img id="Codehighlighter1_137_256_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_137_256_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_137_256_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_137_256_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_137_256_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_137_256_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_137_256_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_137_256_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_137_256_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_137_256_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;</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.</span></span></span></span>Params<span id="Codehighlighter1_24_375_Open_Text"><span id="Codehighlighter1_55_373_Open_Text"><span id="Codehighlighter1_137_256_Open_Text"><span style="color: #000000;">.AllKeys</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/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/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;[SpecialName]<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;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetBoundMember(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img id="Codehighlighter1_325_369_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_325_369_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_325_369_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_325_369_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_325_369_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_325_369_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_325_369_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_325_369_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_325_369_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_325_369_Open_Text"><span style="color: #000000;">{<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;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.</span></span></span></span>Params<span id="Codehighlighter1_24_375_Open_Text"><span id="Codehighlighter1_55_373_Open_Text"><span id="Codehighlighter1_325_369_Open_Text"><span style="color: #000000;">[name];<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;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<p>注：上面的代码仅为了表达意思，其中有明显的语法错误，实际的代码要比上面的稍微复杂一点。</p>
<p>上面的代码中，GetMemberNames方法告诉DLR系统通过这个方法获得该对象上的所有属性（你可以认为方法是一个Delegate类型属性）而不是通过反射。下面的GetBoundMember方法实现具体的Get属性或方法实现。通过SpecialNameAttribute以标识这些方法可以被DLR使用。<br />
</p>
<p>但是，上面的实现使得HttpRequest对象多出了两个公共接口。对于没有深入理解过DLR的实现的开发人员来说，这两个接口非常的费解。怎样让C#开发人员和IronPython语言开发人员都很舒服呢？<br />
</p>
<p><strong>我们来看看微软的实现</strong><br />
</p>
<p>首先，微软在ASP.NET Future中关于动态语言支持的代码主要在Microsoft.Web.Scripting.dll中。因此我们从这个Assembly开始着手。使用Reflector打开这个文件，我们可以看到Assembly中添加了这个Attribute。</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;">[assembly:&nbsp;ExtensionType(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(HttpRequest),&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(RequestParamsMembersInjector))]</span></div>
<p> </p>
<p style="font-size: 10pt;">注：注意，这个Attribute是添加在Assembly上，而不是扩展的任何一方的类型上。因为加载一个Assembly时遍历其中的类型是一件低性能并危险的事情。<br />
</p>
<p>呵呵，从标题中，大家应该已经知道&#8220;ExtensionTypeAttribute&#8221;是本节内容的重点。就是他实现了为已有CLR对象添加DLR支持功能的。<br />
</p>
<p>我们顺藤摸瓜，找到RequestParamsMembersInjector这个类型的实现，如下：</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>&nbsp;<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;">class</span><span style="color: #000000;">&nbsp;RequestParamsMembersInjector<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">{<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Methods</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;[OperatorMethod]&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;注1</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">5</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;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetBoundMember(HttpRequest&nbsp;request,&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;name)<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: #008080;">7</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;request.Params[name];<br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">}</span></div>
<p> </p>
<p>注1：这里也许是以前版本的定义。在Bata3中没有找到这个Attribute，取而代之的是SpecialNameAttribute。 </p>
<p>通过这个类，实现了为HttpRequest类型添加了一个GetBoundMember方法。看起来很像.NET 3.5提供的扩展方法。只是this关键字被SpecialNameAttribute代替了。</p>
<p><strong>最后，给出一个我们自己的实现</strong></p>
<p>这一节，我们为DLConsole添加了一个LoadAssembly方法，用来加载Extension。我们在测试工程中添加了一个SimplaXmlExtension类型实现访问XmlElement的子节点的功能。你可以从<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>可运行的源代码。扩展的代码如下：</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_075231" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_075231').style.display='none'; document.getElementById('Code_Open_Image_075231').style.display='inline'; document.getElementById('Code_Open_Text_075231').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" height="16"><img id="Code_Open_Image_075231" style="display: none;" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_075231').style.display='none'; getElementById('Code_Closed_Image_075231').style.display='inline'; getElementById('Code_Closed_Text_075231').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" height="16"><span id="Code_Closed_Text_075231" class="cnblogs_code_Collapse">扩展的实现代码</span><span id="Code_Open_Text_075231" style="display: none;"><br />
<!--<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: #000000;">[assembly:&nbsp;ExtensionType(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(XmlElement),&nbsp;</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(TestDynamicLanguageConsole.SimpleXmlExtension))]<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" /><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" /></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;TestDynamicLanguageConsole<br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_139_1587_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_139_1587_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_139_1587_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_139_1587_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_139_1587_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_139_1587_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_139_1587_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_139_1587_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_139_1587_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_139_1587_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;</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;">class</span><span style="color: #000000;">&nbsp;SimpleXmlExtension<br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #000000;"><img id="Codehighlighter1_188_1585_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_188_1585_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_188_1585_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_188_1585_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_188_1585_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_188_1585_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_188_1585_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_188_1585_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_188_1585_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_188_1585_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;[SpecialName]<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;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;IList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SymbolId</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetMemberNames(</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;obj)<br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #000000;"><img id="Codehighlighter1_285_750_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_285_750_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_285_750_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_285_750_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_285_750_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_285_750_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_285_750_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_285_750_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_285_750_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_285_750_Open_Text"><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;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SymbolId</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">SymbolId</span><span style="color: #000000;">&gt;</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;XmlElement&nbsp;xml&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;XmlElement;<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" /><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" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(xml&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img id="Codehighlighter1_433_714_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_433_714_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_433_714_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_433_714_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_433_714_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_433_714_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_433_714_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_433_714_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_433_714_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_433_714_Open_Text"><span style="color: #000000;">{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(XmlNode&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;xml.FirstChild;&nbsp;n&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n.NextSibling)<br />
</span><span style="color: #008080;">16</span><span style="color: #000000;"><img id="Codehighlighter1_530_700_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_530_700_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_530_700_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_530_700_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_530_700_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_530_700_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_530_700_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_530_700_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_530_700_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_530_700_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;XmlElement)<br />
</span><span style="color: #008080;">18</span><span style="color: #000000;"><img id="Codehighlighter1_593_682_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_593_682_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_593_682_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_593_682_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_593_682_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_593_682_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_593_682_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_593_682_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_593_682_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_593_682_Open_Text"><span style="color: #000000;">{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.Add(SymbolTable.StringToId(n.Name));<br />
</span><span style="color: #008080;">20</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">21</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">22</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;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><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" /><br />
</span><span style="color: #008080;">24</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;list;<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;&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/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">27</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;[SpecialName]<br />
</span><span style="color: #008080;">28</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;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">&nbsp;GetBoundMember(</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;">29</span><span style="color: #000000;"><img id="Codehighlighter1_851_1579_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_851_1579_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_851_1579_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_851_1579_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_851_1579_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_851_1579_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_851_1579_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_851_1579_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_851_1579_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_851_1579_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">30</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;XmlElement&nbsp;xml&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;obj&nbsp;</span><span style="color: #0000ff;">as</span><span style="color: #000000;">&nbsp;XmlElement;<br />
</span><span style="color: #008080;">31</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">32</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;">if</span><span style="color: #000000;">&nbsp;(xml&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">33</span><span style="color: #000000;"><img id="Codehighlighter1_943_1525_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_943_1525_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_943_1525_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_943_1525_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_943_1525_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_943_1525_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_943_1525_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_943_1525_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_943_1525_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_943_1525_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">34</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(XmlNode&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;xml.FirstChild;&nbsp;n&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;n&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;n.NextSibling)<br />
</span><span style="color: #008080;">35</span><span style="color: #000000;"><img id="Codehighlighter1_1040_1511_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1040_1511_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1040_1511_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1040_1511_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1040_1511_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1040_1511_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1040_1511_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1040_1511_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1040_1511_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_1040_1511_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">36</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;XmlElement&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.CompareOrdinal(n.Name,&nbsp;name)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">)<br />
</span><span style="color: #008080;">37</span><span style="color: #000000;"><img id="Codehighlighter1_1147_1493_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1147_1493_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1147_1493_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1147_1493_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1147_1493_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1147_1493_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1147_1493_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1147_1493_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1147_1493_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_1147_1493_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">38</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(n.HasChildNodes&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;n.FirstChild&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;n.LastChild&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;n.FirstChild&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">&nbsp;XmlText)<br />
</span><span style="color: #008080;">39</span><span style="color: #000000;"><img id="Codehighlighter1_1276_1351_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1276_1351_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1276_1351_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1276_1351_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1276_1351_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1276_1351_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1276_1351_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1276_1351_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1276_1351_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_1276_1351_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">40</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;&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;n.InnerText;<br />
</span><span style="color: #008080;">41</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">42</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">43</span><span style="color: #000000;"><img id="Codehighlighter1_1405_1470_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1405_1470_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1405_1470_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1405_1470_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1405_1470_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1405_1470_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1405_1470_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1405_1470_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1405_1470_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_1405_1470_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">44</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;&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;n;<br />
</span><span style="color: #008080;">45</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">46</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">47</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">48</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">49</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;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">50</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
</span><span style="color: #008080;">51</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;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArgumentException();<br />
</span><span style="color: #008080;">52</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;">53</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;">54</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><span style="color: #008080;">55</span><span style="color: #000000;"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span></span></div>
<p>你可以在程序中输入并运行如下的Python代码来测试这个扩展的工作。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;Foo.bar1<br />
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;Foo.bar2</span></div>
<p> </p>
<p><strong>总结</strong></p>
<p>在前几篇文章的留言中，<a href="http://rednaxelafx.javaeye.com/" target="_blank">RednaxelaFX</a>提到真正的让一个CLR对象支持动态语言，还是需要实现IDynamicObject接口。下去研究了一下，这个接口确实提供了更加强大的能力。如下： <br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img id="Codehighlighter1_38_194_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_194_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_38_194_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_194_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_38_194_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_194_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_38_194_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_194_Open_Text').style.display='inline';" align="top"><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;Microsoft.Scripting.Runtime&nbsp;</span><span id="Codehighlighter1_38_194_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_194_Open_Text"><span style="color: #000000;">{<br />
<img id="Codehighlighter1_76_192_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_76_192_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_76_192_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_76_192_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_76_192_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_76_192_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_76_192_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_76_192_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;">interface</span><span style="color: #000000;">&nbsp;IDynamicObject&nbsp;</span><span id="Codehighlighter1_76_192_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_76_192_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;RuleBuilder</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;GetRule</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(DynamicAction&nbsp;action,&nbsp;CodeContext&nbsp;context,&nbsp;</span><span style="color: #0000ff;">object</span><span style="color: #000000;">[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;T&nbsp;:&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<p><a id="AjaxHolder_Comments_CommentList_ctl04_NameLink" href="http://rednaxelafx.javaeye.com/" target="_blank"> </a>
</p>
<p>如此简单的接口，可见其功能强大吧<img src="http://www.cnblogs.com/Emoticons/msn/49_49.gif" alt="" />。领会这个接口还需要对DLR有更深入的了解。下面的这个系列的文章可以帮助你更好的理解DLR的一些实现机理。但是，如果你如我一般对编译原理一窍不通。深入这一层次确实是一件危险的事情。</p>
<p><a href="http://rednaxelafx.javaeye.com/blog/237822">LINQ与DLR的Expression tree（1）：简介LINQ与Expression tree<br />
</a><a href="http://rednaxelafx.javaeye.com/blog/241430" target="_blank">LINQ与DLR的Expression tree（2）：简介DLR</a> <br />
<a href="http://rednaxelafx.javaeye.com/blog/246814" target="_blank">LINQ与DLR的Expression tree（3）：LINQ与DLR及另外两个库的AST对比</a> <br />
<a href="http://rednaxelafx.javaeye.com/blog/247270" target="_blank">LINQ与DLR的Expression tree（4）：创建静态类型的LINQ表达式树节点</a> <br />
<a href="http://rednaxelafx.javaeye.com/blog/248317" target="_blank">LINQ与DLR的Expression tree（5）：用lambda表达式表示常见控制结构</a> <a href="http://rednaxelafx.javaeye.com/blog/237822"><br />
</a></p>
<p>相信我们本节提到的方法，就是微软为了减少我们这些菜鸟的学习成本而提出的一个快速解决方案。基本上，我们平时能够想到的大多数功能都可以通过这个扩展注入到原有对象上了。<br />
</p>
<p>但是，这里还有一个小问题需要注意： <br />
</p>
<p>如果扩展对象和被扩展对象不再同一个Assembly中，你必须先将扩展所在的Assembly加载进来（使用ScripDomainManager.LoadAssembly方法<span style="font-size: 8pt;">(c#)</span>或clr.AddReference方法<span style="font-size: 8pt;">（Py）</span>），然后操作被扩展对象才能够使用扩展所添加的功能。因为，DLR使用的是JIT的技术，也就是说他在第一次操作一个类型的对象时，会将对这个对象的操作Cache下来。下一次他就会直接使用Cache下来的操作。而不是每一次都解释执行代码。</p>
<p>至此，我们基本可以完成大多数我们期望的动态语言友好性扩展（关于具体都可以编写哪些SpecialName方法，我会专门编写一章来讨论）。DLConsole也基本完成了。在下一节，我们将考虑让DLConsole支持其他的动态语言。每周一节，敬请<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>大家可以从<a href="http://www.cnblogs.com/Cajon/archive/2008/07/19/integrate_ironpython_into_winform_downloads.html">这里下载</a>可运行的源代码。<br />
</p>
<span style="color: #808080;">免责声明：本系列文章，完全是我个人研读 IronPython源代 码后找到的实现方案，并未详细的研究过IronPython的相关官方文档。因此，并不保证符合微软DLR和IronPython的设计思路，亦不能保证 在DLR和IronPython 2.0正式发布后能够继续使用。</span><img src="aggbug/1303644.html?type=0" width="1" height="1" alt=""/><p>评论: 9　<a href="http://www.cnblogs.com/Cajon/archive/2008/10/06/use_extensiontypeattribute_to_extend_clr_object_ironpython.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/Cajon/archive/2008/10/06/use_extensiontypeattribute_to_extend_clr_object_ironpython.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56793/" target="_blank">知名扩展 Firebug 的简化版登陆 Chrome</a><span style="color:gray">(2010-02-09 22:59)</span><br/>· <a href="http://news.cnblogs.com/n/56792/" target="_blank">Google 悄悄地启用 1e100.net，打枪地不要</a><span style="color:gray">(2010-02-09 22:57)</span><br/>· <a href="http://news.cnblogs.com/n/56791/" target="_blank">从 Google 代码库找到的好东西</a><span style="color:gray">(2010-02-09 22:46)</span><br/>· <a href="http://news.cnblogs.com/n/56789/" target="_blank">苹果在线商店临时关闭 或将推新Macbook</a><span style="color:gray">(2010-02-09 22:39)</span><br/>· <a href="http://news.cnblogs.com/n/56788/" target="_blank">豆瓣网推出豆瓣电台iPhone客户端</a><span style="color:gray">(2010-02-09 21:51)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56782/" target="_blank">2010年2月编程语言排行榜</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>