﻿<?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://www.cnblogs.com/team/ipy/</link><description>关注IronPython的快乐团队</description><language>zh-cn</language><lastBuildDate>Sat, 28 Jan 2012 18:13:21 GMT</lastBuildDate><pubDate>Sat, 28 Jan 2012 18:13:21 GMT</pubDate><ttl>60</ttl><item><title>numpy和scipy终于可以直接用在.net上了</title><link>http://www.cnblogs.com/begtostudy/archive/2011/11/04/2235197.html</link><dc:creator>白途思</dc:creator><author>白途思</author><pubDate>Thu, 03 Nov 2011 16:08:00 GMT</pubDate><guid>http://www.cnblogs.com/begtostudy/archive/2011/11/04/2235197.html</guid><description><![CDATA[<p><p><span style="font-size: medium;">科学计算语言，底层的当属fortran和C，上层的是matlab用户最多了，居然可以排进世界十大语言。<br />但是matlab的效率和部署问题，使得很多人只在其上进行算法开发、仿真、调试，之后还要用通用语言重写算法实现。<br />将matlab是商业软件，python作为一种开放的语言逐渐在科学计算领域流行起来。<br />numpy和scipy就是基于python开发的两个库。<br />其实还有很多其他科学计算软件。只是python作为一种通用脚本语言易用，易集成。<br />所以易用，是像matlab一样随写随运行，所谓易集成，就是可以使用很多其他领域开发的包，而不局限在科学计算领域。<br /><br />python作为一种脚本语言需要解释器支持，一种是CPython，基于C语言开发的，跨平台性好，一种是Ironpython，基于.net语言开发的，和.net程序结合很好。<br />同一种语言可以运行在上面两个平台，但是上面两个平台的库互调用就很麻烦了。<br />比如numpy和scipy就是在CPython上开发的，用在ironpython里需要ironclad做转换。<br /><br />现在numpy和scipy也做了在Ironpython上可以直接运行的版本，就是本文介绍的。<br />可以看这个<br />http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net<br /><br />下面是转载的：<br /></span></p>
<p><span style="font-size: medium;">作为Python Tools for Visual Studio项目的一部分，NumPy和SciPy程序库已经迁移到.NET上了。这项迁移通过本地的C核心组合了C#和C接口，从而所有.NET语言都能够从中受益。</span></p>
<p><span style="font-size: medium;"><a href="http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net" target="_blank">IronPython对NumPy和SciPy的端口</a>是
完整的.NET端口，并且包含了针对一般本地C核心的自定义C#/C接口。这意味着不仅IronPython能够使用所有功能，而且所有.NET语言&mdash;&mdash;
像C#和F#&mdash;&mdash;也可以使用，它们只需要访问C#接口对象， 
或者有时需要从其它.NET语言解析IronPython表达式。这意味着多维数组对象（ndarray）可以在IronPython和C#或者F#代码
之间平滑地传递。此外，ndarray对象实现了标准的IEnumerable接口，这让数组对象可以由现存的代码经常使用，即便不是特别针对NumPy
的代码也没问题。</span></p>
<p><span style="font-size: medium;"><a href="http://en.wikipedia.org/wiki/NumPy" target="_blank">NumPy</a>是一种很低级别的API，用于在
大型、多维数组和矩阵上执行数学运算。这个库最初叫做Numeric，是在1995年创建的，那仅仅是Python 
1.0发布一年之后。采用当前名称的版本是在2005年创建的，那时这个产品组合了早先的版本和名为numarray的竞争对手的程序库。</span></p>
<p><span style="font-size: medium;"><a href="http://www.scipy.org/" target="_blank">SciPy</a>是在其基础之上构建的。据维基百科上所说，&ldquo;SciPy包含很多模块，能够用于优化、线性代数、整合、插入、特定函数、FFT、符号和图像处理、ODE解析器以及其它科学和工程领域的一般任务。&rdquo; 人们经常会考虑把它作为MATLAB的替代方案，尽管SciPy经常需要与<a href="http://en.wikipedia.org/wiki/SciPy#Additional_functionality" target="_blank">其它库</a>组合才能够完全替代MATLAB。</span></p>
<p><span style="font-size: medium;">NumPy和SciPy的组合为一般的.NET代码提供了很多显而易见的优势。.NET的垃圾回收程序能够比手动的内存管理提供更好的性能，还有就是，通过高度优化的C代码，我们可以获得很好的计算速度。</span></p>
<p><span style="font-size: medium;">在此之上还有视图的概念。NumPy不会复制数组，而是让我们可以创建作为其他数组子集存在的数组。改变子集（也就是所说的视图），也会改变原始的数组。这让我们可以在不牺牲性能的情况下获得更整洁的代码。</span></p>
<p><span style="font-size: medium;">
<strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2011/07/NumPy-NET;jsessionid=5441D85FE5AF89B4FC9E2265628BA703" target="_blank">NumPy and SciPy for .NET</a></span></p><img src="http://www.cnblogs.com/begtostudy/aggbug/2235197.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/begtostudy/" target="_blank">白途思</a> 发表于 2011-11-04 00:08 <a href="http://www.cnblogs.com/begtostudy/archive/2011/11/04/2235197.html" target="_blank">原文链接</a></p><p>评论: 1　<a href="http://www.cnblogs.com/begtostudy/archive/2011/11/04/2235197.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/begtostudy/archive/2011/11/04/2235197.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>在.NET上进行线性代数等科学计算</title><link>http://www.cnblogs.com/redmoon/archive/2011/03/29/1999242.html</link><dc:creator>redmoon</dc:creator><author>redmoon</author><pubDate>Tue, 29 Mar 2011 14:19:00 GMT</pubDate><guid>http://www.cnblogs.com/redmoon/archive/2011/03/29/1999242.html</guid><description><![CDATA[<p><p>对于工程类、图形等专业软件，需要大量的数学计算，而用的最多的就是线性代数的计算。</p> <p>那么，在.NET之上，尤其.NET 4.0和VS2010之上要如何完成相关的线性代数计算呢？我想有如下几种方式：</p> <p>一，自己动手、丰衣足食：根据自己软件的需要，增量式地逐步开发一些函数库。这种方式最大的问题是&#8212;&#8212;重新制作轮子，所以大部分一般不宜采用这种方式。</p> <p>二，使用开源（或免费的）组件：这种方式的好处是有很多优秀的开源（或免费）的工具可选择，缺点是使用起来需要较大的学习成本</p> <p>三，使用商业组件：这种方式相对于第二种的好处是，支持和服务上有所保障，缺点不言而喻就是费用较高。</p> <p>下面，我将重点介绍中.NET平台上有什么用的开源（免费）组件可用。</p> <p>1，使用F#进行开发</p> <p>F#作为一门混合语言（函数式语言+面向对象语言），从一开始就是具有进行数学计算的优势。不仅编写计算代码更自然，F#的函数库也为数学计算提供了很好的支持。</p> <p>在F#的powerpack中包含有Microsoft.FSharp.Math的命名空间就是专门用于数学计算的。其中提供了matrix类型&#8212;&#8212;一种在进行线性代数计算中非常常用和重要的类型。</p> <p>关于matrix类型可以阅读这里的<a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.PowerPack/Microsoft.FSharp.Math.type_Matrix-1.html">帮助</a>。也可以参考这个博客：<a title="http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-i-f.html" href="http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-i-f.html">http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-i-f.html</a></p> <p>但是，要进行高效的线性代数计算，F#还需要借助外部的函数库，不过F#已经提供了相应的接口方便外部函数库集成进来，即是FSharp.PowerPack.Math.Providers.dll（这个程序集只有在FSharp-1.9.7.8中才有）。</p> <p>比如，F#可以集成LAPACK（<strong>LAPACK</strong>，其名為<strong>L</strong>inear <strong>A</strong>lgebra <strong>PACK</strong>age的縮寫，是一以<a href="http://zh.wikipedia.org/wiki/Fortran">Fortran</a><a href="http://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80">程式語言</a>寫就，用於<a href="http://zh.wikipedia.org/w/index.php?title=%E6%95%B8%E5%80%BC%E8%A8%88%E7%AE%97&amp;action=edit&amp;redlink=1">數值計算</a>的<a href="http://zh.wikipedia.org/w/index.php?title=%E5%87%BD%E5%BC%8F%E9%9B%86&amp;action=edit&amp;redlink=1">函式集</a>。 LAPACK提供了豐富的<a href="http://zh.wikipedia.org/w/index.php?title=%E5%B7%A5%E5%85%B7%E5%87%BD%E5%BC%8F&amp;action=edit&amp;redlink=1">工具函式</a>，可用於諸如解多元<a href="http://zh.wikipedia.org/w/index.php?title=%E7%B7%9A%E6%80%A7%E6%96%B9%E7%A8%8B%E5%BC%8F&amp;action=edit&amp;redlink=1">線性方程式</a>、<a href="http://zh.wikipedia.org/wiki/%E7%B7%9A%E6%80%A7%E7%B3%BB%E7%B5%B1">線性系統</a>方程組的<a href="http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95">最小平方</a>解、計算<a href="http://zh.wikipedia.org/wiki/%E7%89%B9%E5%BE%B5%E5%90%91%E9%87%8F">特徵向量</a>、用於計算<a href="http://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3">矩陣</a><a href="http://zh.wikipedia.org/wiki/QR%E5%88%86%E8%A7%A3">QR分解</a>的<a href="http://zh.wikipedia.org/wiki/%E8%B1%AA%E6%96%AF%E9%9C%8D%E5%BE%B7%E5%8F%98%E6%8D%A2">Householder轉換</a>、以及<a href="http://zh.wikipedia.org/w/index.php?title=%E5%A5%87%E7%95%B0%E5%80%BC&amp;action=edit&amp;redlink=1">奇異值</a>分解等問題。 在<a href="http://www.netlib.org/lapack95/">NetLib</a>亦提供了<a href="http://zh.wikipedia.org/wiki/API">API</a>經簡化的<a href="http://zh.wikipedia.org/wiki/Fortran">Fortran</a> 95版本的LAPACK95。LAPACK以<a href="http://zh.wikipedia.org/wiki/BSD%E8%AE%B8%E5%8F%AF%E8%AF%81">BSD授權</a>的方法釋出。）</p> <p>具体的集成方式可以参考：<a title="http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-ii.html" href="http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-ii.html">http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-ii.html</a>，<a title="http://fdatamining.blogspot.com/2010/03/compiling-lapack-for-net-usage.html" href="http://fdatamining.blogspot.com/2010/03/compiling-lapack-for-net-usage.html">http://fdatamining.blogspot.com/2010/03/compiling-lapack-for-net-usage.html</a></p> <p>关于如何在F#中进行代数运算，这里有一个例子：<a title="http://fdatamining.blogspot.com/2010/04/matrix-and-linear-algebra-in-f-part-iii.html" href="http://fdatamining.blogspot.com/2010/04/matrix-and-linear-algebra-in-f-part-iii.html">http://fdatamining.blogspot.com/2010/04/matrix-and-linear-algebra-in-f-part-iii.html</a></p> <p>其实，我上面引用的博客地址：<a title="http://fdatamining.blogspot.com/" href="http://fdatamining.blogspot.com/">http://fdatamining.blogspot.com/</a>都是值得一读的。</p> <p>2，使用IronPython进行开发</p> <p>Python虽然不是函数式语言，但是其动态语言特性和代码风格也被很多人用来进行工程开发。而在Python之上有一个很著名的数学计算库&#8212;&#8212;<a href="http://numpy.scipy.org/">NumPy</a>和<a href="http://scipy.org/">SciPy</a>，它也被移植到了.NET之上（移植的过程是在微软的帮助下）。</p> <p>要使用这两个库，最好的就是通过<a href="http://pytools.codeplex.com/">Python Tools for Visual Studio</a>&#8212;&#8212;一个在VS2010中实现的Python集成开发环境来使用。</p> <p>具体的使用向导可以访问：<a title="http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net" href="http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net">http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net</a></p> <p>3，使用C#进行开发</p> <p>在.NET 4.0中，加入了System.Numerics命名空间，为数学计算提供了一定的基础，但是.NET中还是没有内置线性代数的计算函数库。不过要使用C#开发，上面提到的LAPACK和SciPy都可以用。</p> <p>对于LAPACK，也有.NET的版本，就是：<a href="http://www.dotnumerics.com/">DotNumerics</a></p> <p>当然，还有很多第三方的开源、免费和商业的组件可用。</p> <p>下面就来看看，还有那些组件：</p> <ol> <li><a href="http://www.extremeoptimization.com/Default.aspx">Extreme Optimization Numerical Libraries for .NET</a>（商业）</li> <li><a href="http://www.bluebit.gr/">.NET Matrix Library</a>（商业）</li> <li><a href="http://www.centerspace.net/">NMath .NET</a>（商业）</li> <li><a href="http://www.nag.co.uk/numeric/DT/DTdescription.asp">NAG Library for .NET</a>（商业）</li> <li><a href="http://www.obacs.com/">SCINET</a>（商业） </li> <li><a href="http://www.mathdotnet.com/">Math.Net</a>（开源）</li> <li><a href="http://linearalgebra.codeplex.com/">Dambach Linear Algebra Framework</a>（开源）</li> <li><a href="http://ilnumerics.net/">ILNumerics.Net</a>（开源）</li> <li><a href="http://www.lutzroeder.com/dotnet/">Mapack</a>（开源，我们的LCA软件就是使用的这个，其实我做了一个Provider可以任意切换到其他函数库上，后面我会再写篇博客来介绍）</li> <li><a href="http://www.meta-numerics.net/">Meta.Numerics</a>（免费）</li></ol> <p>另外，对于使用哪种语言来进行科学计算开发，可以参考这篇博客的一些论述：<a href="http://bbs.sciencenet.cn/home.php?mod=space&amp;uid=234554&amp;do=blog&amp;id=354054">C#-F#-Ironpython与科学计算</a>，当然个人觉得F#和IronPython都适合进行科学计算。</p><img src="http://www.cnblogs.com/redmoon/aggbug/1999242.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/redmoon/" target="_blank">redmoon</a> 发表于 2011-03-29 22:19 <a href="http://www.cnblogs.com/redmoon/archive/2011/03/29/1999242.html" target="_blank">原文链接</a></p><p>评论: 6　<a href="http://www.cnblogs.com/redmoon/archive/2011/03/29/1999242.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/redmoon/archive/2011/03/29/1999242.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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/begtostudy/archive/2011/03/14/1984212.html</link><dc:creator>白途思</dc:creator><author>白途思</author><pubDate>Mon, 14 Mar 2011 13:30:00 GMT</pubDate><guid>http://www.cnblogs.com/begtostudy/archive/2011/03/14/1984212.html</guid><description><![CDATA[<p><p><span style="font-size: medium;" size="4">关注Ironpython很久了，但是一直也没有应用的场合。</span></p>
<p><span style="font-size: medium;" size="4">不同于python的广泛应用，Ironpython真的是雷声大雨点小。宣传、简介铺天盖地，貌似很有前途。</span></p>
<p><span style="font-size: medium;" size="4">实际上，我真的很少有用到ironpython的情况。ironruby也是如此。</span></p>
<p><span style="font-size: medium;" size="4">&nbsp;</span></p>
<p><span style="font-size: medium;" size="4">曾经尝试用Ironpython来写程序，但是其调试非常复杂。</span></p>
<p><span style="font-size: medium;" size="4">好在和VS2010结合比较早，调试还算方便。可是关键的问题是，如果我用了VS2010，我干嘛不直接用C#，其开发和调试能力有目共睹。</span></p>
<p><span style="font-size: medium;" size="4">&nbsp;</span></p>
<p><span style="font-size: medium;" size="4">至今，我能够使用Ironpython的地方只有一处，那就是NEUT，一个个人开发的小软件。</span></p>
<p><span style="font-size: medium;" size="4">在处理搜索字符串拼接问题上，我使用了ironpython。</span></p>
<p><span style="font-size: medium;" size="4">为什么呢？因为搜索字符串拼接，随着不同的网站有不同的方式，比如google scholar、SFX等等，都不尽相同。</span></p>
<p><span style="font-size: medium;" size="4">您可能会问为什么不使用配置文件？因为搜索字符串使用到的数据，也是不尽相同，有的需要的是ISSN号，有的需要标题。甚至还要做大小写转换，以及特殊符号替换处理。配置文件处理起来太麻烦。</span></p>
<p><span style="font-size: medium;" size="4">采用Ironpython，很轻松就处理了，毕竟是程序而不是配置文件，我可以很便捷的根据不同的网站进行字符串拼接。</span></p>
<p><span style="font-size: medium;" size="4">其实，有很多软件的配置文件，也是用python写的。</span></p>
<p><span style="font-size: medium;" size="4">&nbsp;</span></p>
<p><span style="font-size: medium;" size="4">ironpython的使用十分不便，调用python程序，还需要一些辅助模块，害的我处理了很久。</span></p>
<p><span style="font-size: medium;" size="4">当然，如果只是ironpython使用dotnet功能还好点。</span></p>
<p><span style="font-size: medium;" size="4">问题是dotnet的类名、方法名都很长！如果没有IDE的帮助，我很难记起全称&hellip;&hellip;</span></p>
<p><span style="font-size: medium;" size="4">所以说ironpython，中看不中用。</span></p>
<p><span style="font-size: medium;" size="4">&nbsp;</span></p>
<p><span style="font-size: medium;" size="4">另外，ironpython作为脚本语言，适合处理运行时变化的情况。就是说进程不关闭，改变脚本，有不同的结果。</span></p>
<p><span style="font-size: medium;" size="4">如果python程序驻留在进程里，就非常的麻烦，也失去其特长。</span></p>
<p><span style="font-size: medium;" size="4">比如我有一次写了一个类扩展dotnet接口，然后用dotnet反射加载。这样这个对象就驻留在内存里。</span></p>
<p><span style="font-size: medium;" size="4">如果我不关闭程序，或者重启ironpython的runtime，我改变ironpython文件是没有意义的，还是会按旧程序运行！因为这个对象没有消亡。</span></p>
<p><span style="font-size: medium;" size="4">相反，如果仅仅是个方法，调用完了就接触python程序任务，那真是方便。毕竟不用重启主程序。</span></p><img src="http://www.cnblogs.com/begtostudy/aggbug/1984212.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/begtostudy/" target="_blank">白途思</a> 发表于 2011-03-14 21:30 <a href="http://www.cnblogs.com/begtostudy/archive/2011/03/14/1984212.html" target="_blank">原文链接</a></p><p>评论: 0　<a href="http://www.cnblogs.com/begtostudy/archive/2011/03/14/1984212.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/begtostudy/archive/2011/03/14/1984212.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>三言两语话委托</title><link>http://www.cnblogs.com/perhaps/archive/2010/05/16/1736804.html</link><dc:creator>FantasySoft</dc:creator><author>FantasySoft</author><pubDate>Sun, 16 May 2010 08:18:00 GMT</pubDate><guid>http://www.cnblogs.com/perhaps/archive/2010/05/16/1736804.html</guid><description><![CDATA[<p><p>几天前，Michael<a href="http://www.cnblogs.com/perhaps/archive/2010/05/11/1732203.html" target="_blank">向大家推荐了刚发布的IronPython Tools for Visual Studio</a>。不知道这个消息是否能够为大家学习IronPython注入少许动力呢？有了IDE的支持，Michael的学习热情也随之高涨了，把若干年前的随笔翻箱倒柜的看了个遍，那个感慨啊&#8230;&#8230;对技术充满激情的岁月或许再也回不去了。咳，别感春悲秋嘛，这可是在写技术随笔哦！好吧，让我们回归正题。</p>
<p>在翻箱倒柜过程中，我看到了在2007年2月发表的<a href="http://www.cnblogs.com/perhaps/archive/2007/02/07/642785.html" target="_blank">《不谈模式，只谈实现》</a>。这是受到<a href="http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html" target="_blank">Justin一篇美文</a>的启发，我所写的当年唯一一篇有关程序设计的文章。对于这篇随笔，老赵给我留下了这样的评论：</p>
<blockquote style="margin-right: 0px" dir="ltr">
<p>&#8220;这就是动态语言啊，相当于保留函数指针。 <br />C#里面很像函数指针的是什么的呢？就是delegate。 <br />而delegate的典型应用是什么呢？就是事件机制。 <br />那么Java里的事件机制是怎么做到的呢？就是定义EventListener然后实现相应的方法。这就是和那个OO的Duck类似的实现了，一个Duck和一个EventListener在这个方面有些接近。 <br />如果不熟悉Java的Event Listener的话也可以用传统的Observer模式来看，而且其实Event Listener等等，其实不就是用了Observer模式嘛。&#8221;</p></blockquote>
<p>说实在话，由于自己水平有限，偶对这个评论并不能完全理解，特别是老赵提到了我并不是非常熟悉的delegate。到三年后的今天，偶再次阅读这条评论的时候，不得不由衷赞叹：老赵的评论字字珠玑！对于偶这个Java开发者来说，委托（delegate）是一个相对陌生的概念，即便是<a href="http://www.cnblogs.com/perhaps/archive/2005/09/01/228302.html" target="_blank">动态代理</a>也并非委托在Java世界里的孪生兄弟。事实上，Java语言为什么能够如此流行，<span style="color: red">抛弃了难以驾驭的指针，降低了学习门槛</span>是重要原因之一。但是，没了指针，也直接导致无法使用函数指针，这让很多C++开发人员使用Java就等于丧失了大半功力。C#作为Java后来者，在灵活性和简单之间取得了良好的平衡点，譬如，<a href="http://www.cnblogs.com/perhaps/archive/2004/07/14/23957.html" target="_blank">在方法参数上，Java只能传值，而C#既可以传值也可以传引用</a>。对于函数指针，C#则创造了新的机制与之对应&#8212;&#8212;那就是委托了。如果您和我一样，对委托了解得不够深入的话，建议您将<a href="http://www.cnblogs.com/JimmyZhang" target="_blank">JimmyZhang</a>的经典文章&#8212;&#8212;<a href="http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html" target="_blank">《C# 中的委托和事件》</a>反复研读几遍，就会对委托有充分的了解了。如果您也和我一样，对为什么需要委托也心存疑虑的话，建议您阅读老赵的美文&#8212;&#8212;<a href="http://www.infoq.com/cn/articles/higher-order-function" target="_blank">《高阶函数、委托与匿名方法》</a>，这也是一篇值得反复品味的文章。看了上述两篇文章之后，我们可以得出这样的结论：<span style="color: red">委托类型实现了强类型函数指针的功能，通过委托类型，我们可以将某个函数封装起来作为另外一个函数的参数</span>。这个特点在函数编程语言（譬如IronPython）中则不是什么新鲜事了，对照《C# 中的委托和事件》中的第一个完整的范例，使用IronPython实现之：&nbsp;</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;EnglishGreeting(name):<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">Morning,</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;name)<br />...<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;ChineseGreeting(name):<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">早上好,</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;name)<br />...<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;GreetPeople(name,&nbsp;MakeGreeting):<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MakeGreeting(name)<br />...<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;GreetPeople(</span><span style="color: #800000">"</span><span style="color: #800000">Jimmy&nbsp;Zhang</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;EnglishGreeting)<br />Morning,Jimmy&nbsp;Zhang<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;GreetPeople(</span><span style="color: #800000">"</span><span style="color: #800000">张子阳</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;ChineseGreeting)<br />早上好,张子阳</span></div></div>
<p>由于IronPython是一门动态语言，并且支持函数编程范式，所以我们可以直接将函数（方法）作为参数传递给另外一个函数（方法）。而在C#中，要实现这一点就需要使用委托类型了。</p>
<p>接下来，既然C#创造了委托类型，那么它的应用又在哪呢？是的，正如老赵的评论所言，<span style="color: red">事件机制是委托最典型的应用</span>。有很多朋友都会觉得委托的使用有些多此一举，直接调用不就好了，那么兜兜转转干嘛呢？实际上，如果您希望直接调用也没啥问题，但是当需求改变的时候，您发现代码有无数的地方需要修改，那个时候就估计一个头两个大了。<span style="color: red">通过委托，我们可以更好地实现Observer模式，而这个模式定义了对象之间一对多的</span><span style="color: red">依赖关系，当一个对象改变了状态，那么所依赖的多个对象就会收到通知并且更新状态。</span>要更好地了解Observer这个模式，除了《C# 中的委托和事件》中的讲解之外，仍旧是JimmyZhang的力作&#8212;&#8212;<a href="http://www.cnblogs.com/JimmyZhang/archive/2008/06/18/1225061.html" target="_blank">《重温Observer模式--热水器&#183;改》</a>。文中给出了不使用委托实现Observer的方法，大家可以对比一下，繁简立现！看到文中IObservable接口的Register(IObserver obj)和Unregister(IObserver obj)方法，大家会联想到什么？是的，就是在.NET事件机制的典型应用当中，经常出现的+=和-=操作符，它们的作用在于更改委托对象所引用的方法列表。如果不使用委托，那么我们并不能直接对引用的方法列表进行操作，而要面向接口进行编程了。而对于IronPython来说，既然函数是一等公民，可以作为方法的参数，那么通过list的append方法就能轻松操作引用的方法列表了。参照JimmyZhang的两篇文章，我们也可以使用IronPython实现类似的热水器功能：&nbsp;</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;makeAlarm(temperature):<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">Alarm:&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;str(temperature))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;showMsg(temperature):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">Display:&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;str(temperature))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Heater:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">__init__</span><span style="color: #000000">(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.event&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[]<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;boilWater(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;range(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">100</span><span style="color: #000000">):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.temperature&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;self.temperature&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">95</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[m(self.temperature)&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;self.event]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />heater&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Heater()<br />heater.event.append(makeAlarm)<br />heater.event.append(showMsg)<br />heater.boilWater()</span></div></div>
<p>上述代码中的[m(self.temperature)&nbsp;<span>for</span><span>&nbsp;m&nbsp;</span><span>in</span><span>&nbsp;self.event]使用了IronPython强大的列表内涵特性，self.event是一个list，其中的元素就是makeAlarm和showMsg这两个函数。通过m(self.temperature)就能够以self.temperature为参数调用上述两个函数了。大家是否觉得使用IronPython所编写的代码会更加短小精悍呢？</span></p>
<p><span></span>综上所述，如果您不明白什么是委托，那么您可以把它看作强类型的函数指针；如果您不知道什么是函数指针，那么您可以把它看作将函数（方法）作为参数传递的一种机制；如果您不了解为什么需要委托，那么您可以参考一下使用与不使用委托来实现Observer模式之间的区别；如果您不知道为啥需要Observer模式，那么您可以进而了解一下<a href="http://www.cnblogs.com/perhaps/archive/2004/08/15/33515.html" target="_blank">Law of Demeter</a>；如果您仍然不知道为啥需要遵循Law of Demeter，那么您就可以思考一下封装性为啥是面向对象编程核心要素之一了。</p><img src="http://www.cnblogs.com/perhaps/aggbug/1736804.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/perhaps/" target="_blank">FantasySoft</a> 发表于 2010-05-16 16:18 <a href="http://www.cnblogs.com/perhaps/archive/2010/05/16/1736804.html" target="_blank">原文链接</a></p><p>评论: 2　<a href="http://www.cnblogs.com/perhaps/archive/2010/05/16/1736804.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/perhaps/archive/2010/05/16/1736804.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IronPython Tools——为IronPython度身定做的IDE</title><link>http://www.cnblogs.com/perhaps/archive/2010/05/11/1732203.html</link><dc:creator>FantasySoft</dc:creator><author>FantasySoft</author><pubDate>Tue, 11 May 2010 01:26:00 GMT</pubDate><guid>http://www.cnblogs.com/perhaps/archive/2010/05/11/1732203.html</guid><description><![CDATA[<p><p>虽然对于IronPython的开发者来说，打开一个命令行窗口（Console）噼里啪啦地往里写代码是一件很Cool的事情，但是，要让IronPython成为.NET上一等公民，没有IDE的支持多少有点痴人说梦的感觉。Visual Studio 2010在上个月12号全球同步发布了，一直用着Beta 2版本的Michael还指望着正式版能够提供对IronPython的支持，结果希望落空了。在<a href="http://ironpythonstudio.codeplex.com/" target="_blank">IronPython Studio</a>已然成为鸡肋的时候，Michael对一个能够支持IronPython最新版本的IDE可谓望眼欲穿了。事实上，<a href="http://blogs.msdn.com/ironpython/" target="_blank">IronPython Team</a>早在今年二月份举行的<a href="http://us.pycon.org/2010" target="_blank">PyCon 2010</a>上就曾宣布他们将在今年内发布IronPython Tools for Visual Studio（简称IPyTools）。它是以插件的形式出现，安装之后，开发者就能用Visual Studio开发和调试IronPython程序了。最近，该<a href="http://www.ironpython.net/tools/" target="_blank">IronPython Tools</a>终于透过<a href="http://www.ironpython.net/" target="_blank">IronPython的官方网站</a>发布了！</p>
<p>&nbsp;</p>
<p>要使用IPyTools，<span style="color: red">我们并不需要完整的Visual Studio 2010</span>。得益于良好的设计和扩展性，我们只要安装160多MB的<a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=36023a58-2f85-4f7e-bd87-adac086e7ba6&amp;displaylang=en" target="_blank">Visual Studio 2010 Shell</a>作为IPyTools的运行环境即可。在此，Michael选择的是Visual Studio 2010 Shell的Integrated版本，而非Isolated版本。至于两个版本的区别，您可以从<a href="http://msdn.microsoft.com/en-us/library/bb685612.aspx" target="_blank">这里</a>了解到。在安装了Visual Studio 2010 Shell之后，Michael下载了<a href="http://ironpython.net/tools/" target="_blank">IPyTools</a>&#8212;&#8212;一个只有3.3MB的.vsix文件，双击该文件，出现如下的窗口：</p>
<p>
<div align="center"><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/perhaps/ironpythonInstall.jpg" width="452" height="335" /></div>
<p>&nbsp;</p>
<p>勾选你希望集成的运行环境，点击Install。至此，一个Look and Feel与Visual Studio完全一致并且功能强大的IronPython IDE就安装完成了。之所以选择Visual Studio 2010 Shell与IPyTools搭档，因为这样的组合是完全免费的。特别说明一下，<span style="color: red">IPyTools可以安装至任何一个版本Visual Studio 2010，Express版本除外。</span></p>
<p><span style="color: red"></span>&nbsp;</p>
<p>利用IPyTools，我们可以轻松创建Console、WinForm、WPF等项目；在代码编辑器里，最常见、最实用的Intellisense、Go To Definition和Find All References等功能自然不在话下；调试功能对设置断点、变量查看、栈查看、指令跳转等提供了良好的支持；更重要的是，我们在IDE里还能打开交互式窗口，对一些信手拈来的代码进行调试，这是不是很Cool呢？</p>
<p>
<div align="center"><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/perhaps/IronPythonInteractive.jpg" width="740" height="491" /></div>
<p>&nbsp;</p>
<p>看到这个功能，Michael不由得想起了<a href="http://www.cnblogs.com/perhaps/archive/2005/09/04/230092.html" target="_blank">若干年前自己开发的一个玩具般的IDE&#8212;&#8212;FantasyPython</a>，当时大费周章地实现了命令行窗口与WinForm的集成，由于能力有限，FantasyPython很快就夭折了，开发一个IronPython IDE的愿望也随之破灭了。当时并没有Visual Studio Extension开发的机制，这让开发IDE成为了不可能的任务。而现在，有了Visual Studio Shell，我们在其基础上开发插件，就能得到定制的IDE了。说到这里，Michael不由得感慨：技术革新是第一生产力啊！</p>
<p>&nbsp;</p>
<p>正如IronPython Team在Release Notes所说，IPyTools现在只是一个社区技术预览版本，还有很多地方需要改进。IronPython官方网站上提供了<a href="http://ironpython.net/ironpython/tools/ipy-tools-spec-ctp2.pdf" target="_blank">一份IPyTools的技术说明书</a>，我们从中能够了解到IPyTools最终是个什么样子，为它的改进提出自己的反馈意见。工欲善其事，必先利其器，现在IPyTools来了，恰是学习IronPython好时机，一起来吧！</p><img src="http://www.cnblogs.com/perhaps/aggbug/1732203.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/perhaps/" target="_blank">FantasySoft</a> 发表于 2010-05-11 09:26 <a href="http://www.cnblogs.com/perhaps/archive/2010/05/11/1732203.html" target="_blank">原文链接</a></p><p>评论: 11　<a href="http://www.cnblogs.com/perhaps/archive/2010/05/11/1732203.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/perhaps/archive/2010/05/11/1732203.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>lambda与闭包</title><link>http://www.cnblogs.com/perhaps/archive/2010/05/03/1726442.html</link><dc:creator>FantasySoft</dc:creator><author>FantasySoft</author><pubDate>Mon, 03 May 2010 08:43:00 GMT</pubDate><guid>http://www.cnblogs.com/perhaps/archive/2010/05/03/1726442.html</guid><description><![CDATA[<p><p>在<a href="http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html" target="_blank">《作为.NET程序员，您需要IronPython么？》</a>一文中，Michael给大家介绍了IronPython的诸多优点，其中的一条就是<span style="color: #ff0000">IronPython实现闭包要比C#和VB.NET来得更为直观</span>。在文中，针对&#8220;找出长度较短的字符串&#8221;的功能，我给出了IronPython的代码：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;SampleData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">quick</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">brown</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fox</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">jumped</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">over</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">lazy</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">dog</span><span style="color: #800000">"</span><span style="color: #000000">]<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;maxLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;raw_input(</span><span style="color: #800000">"</span><span style="color: #800000">Maximum&nbsp;length&nbsp;of&nbsp;string&nbsp;to&nbsp;include?</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;maxLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;int(maxLength)<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;shortWords&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[i&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;SampleData&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;len(i)&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;maxLength]</span></div></div>
<p>&nbsp;</p>
<p>这段代码的核心在于最后一个赋值语句，它是典型的列表内涵（List Comprehension）的应用。而事实上，这个赋值语句等价于以下的代码：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">shortWords&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;filter(</span><span style="color: #0000ff">lambda</span><span style="color: #000000">&nbsp;i:&nbsp;len(i)&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;maxLength,&nbsp;SampleData)</span></div></div>
<p>&nbsp;</p>
<p>使用这样的代码也许和<a href="http://www.cnblogs.com/klesh/archive/2008/05/15/the-beauty-of-closures.html" target="_blank">C#和Java的闭包－Jon谈《The Beauty of Closures》</a>一文中C#代码具有更强的可比性，因为lambda是Python中用于定义匿名函数的关键字，而匿名函数又是实现闭包的充分条件之一（非必要条件）。在讨论闭包和lambda之前，我们先来了解一下filter函数。</p>
<p><br />filter(function, sequence)函数是Python的内建函数，我们无需引入任何的包（package）即可使用。它实现了将序列中某些符合条件的元素筛选出来的功能；它需要两个参数：第一个是函数，用于定义筛选条件；而另一个则是序列，作为被筛选的对象。<a href="http://docs.python.org/tutorial/datastructures.html#functional-programming-tools" target="_blank">Python Tutorial给出的示例代码</a>可以帮助我们更好地理解filter这个函数。</p>
<p>&nbsp;</p>
<p>现在，您对filter函数有一定的认识了吧？那么让我们再回到上述的赋值语句。lambda定义了一个匿名函数，它返回了一个布尔值：True或者False，而判断条件则是：参数的长度小于或者等于maxLenth。在这里，lambda充其量只是一个语法糖，让代码更加易读，并没有体现出它与闭包的关系。说到这里，您一定会问：到底什么是闭包呢？从定义上来说：闭包就是由函数与其相关的引用环境组合而成的实体。如果一门语言很好地支持闭包，那么它需要具备以下条件：<br /><span style="color: #ff0000">&nbsp;&nbsp;&nbsp; &#8226; 函数是语言的一等公民，它不从属于其它任何对象，可以作为方法的返回值；</span><br /><span style="color: #ff0000">&nbsp;&nbsp;&nbsp; &#8226; 函数可以嵌套定义；</span><br /><span style="color: #ff0000">&nbsp;&nbsp;&nbsp; &#8226; 可以捕获引用环境，并把引用环境和函数代码组成一个可调用的实体；</span><br /><span style="color: #ff0000">&nbsp;&nbsp;&nbsp; &#8226; 允许定义匿名函数。</span><br />&nbsp;基于上述条件的第三点，我们可以将上述代码改写为如下形式：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;SampleData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">quick</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">brown</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fox</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">jumped</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">over</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">lazy</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">dog</span><span style="color: #800000">"</span><span style="color: #000000">]<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">def</span><span style="color: #000000">&nbsp;filterFunc(maxLength):&nbsp;<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">lambda</span><span style="color: #000000">&nbsp;i:&nbsp;len(i)&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;maxLength<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;maxLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;raw_input(</span><span style="color: #800000">"</span><span style="color: #800000">Maximum&nbsp;length&nbsp;of&nbsp;string&nbsp;to&nbsp;include?</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;maxLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;int(maxLength)<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;shortWords&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;filter(filterFunc(maxLength),&nbsp;SampleData)</span></div></div>
<p>&nbsp;</p>
<p>我们回头对照一下上述的条件，filterFunc不正是闭包的最好体现么？也许您会觉得我有点画蛇添足，多此一举，但是，我们确实拥有了一个极具灵活性的<span style="color: #ff0000">可调用实体</span>。如果要筛选出最大长度为4的单词，我们可以这么做：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">fourLetter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;filter(filterFunc(</span><span style="color: #000000">4</span><span style="color: #000000">),&nbsp;SampleData)</span></div></div>
<p>&nbsp;</p>
<p>如果要筛选出最大长度为3的单词，我们又可以这么做：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">threeLetter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;filter(filterFunc(</span><span style="color: #000000">3</span><span style="color: #000000">),&nbsp;SampleData)<br /></span></div></div>
<p>&nbsp;</p>
<p>我们回想一下面向对象编程当中的函数，它的定义是固定的，不会在运行时发生变化。而闭包则不同，它会根据不同的引用环境发生变化，从而返回不同的函数实例。因此，我会把<span style="color: #ff0000">闭包等同于返回值是函数的函数，而lambda的存在可以让返回的函数定义得到简化。</span>更多有关闭包的介绍，请参考园子里的<a href="http://www.cnblogs.com/Jifangliang" target="_blank">季方亮同学</a>的文章&#8212;&#8212;<a href="http://www.cnblogs.com/Jifangliang/archive/2008/08/05/1260602.html" target="_blank">《函数编程之闭包漫谈(Closure)》</a>；有关lambda的介绍，则请参考<a href="http://www.cnblogs.com/coderzh" target="_blank">CoderZh同学</a>的文章&#8212;&#8212;<a href="http://www.cnblogs.com/coderzh/archive/2010/04/30/python-cookbook-lambda.html" target="_blank">《Python天天美味(35) - 细品lambda》</a>。<br /></p>
<p>最后，也许有朋友会问：我们为什么需要lambda和闭包呢？这是为了将side-effect降至最低，也就是将变量从我们代码当中剔除！我想您一定会对此很惊讶，但这是事实，最纯粹的函数式编程是只有定义的。基于此，最开始的代码还能演变成如下所示：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;SampleData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">quick</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">brown</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fox</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">jumped</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">over</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">lazy</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">dog</span><span style="color: #800000">"</span><span style="color: #000000">]<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;raw_input(</span><span style="color: #800000">"</span><span style="color: #800000">Maximum&nbsp;length&nbsp;of&nbsp;string&nbsp;to&nbsp;include?</span><span style="color: #800000">"</span><span style="color: #000000">)<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">print</span><span style="color: #000000">(filter(</span><span style="color: #0000ff">lambda</span><span style="color: #000000">&nbsp;i:len(i)&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;int(_),&nbsp;SampleData))</span></div></div>
<p>&nbsp;</p>
<p>对编程范式感兴趣的朋友，可以参考我的文章：<a href="http://www.cnblogs.com/perhaps/archive/2005/12/17/299205.html" target="_blank">《说的都是概念&#8212;&#8212;有关编程范式》</a>。</p><img src="http://www.cnblogs.com/perhaps/aggbug/1726442.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/perhaps/" target="_blank">FantasySoft</a> 发表于 2010-05-03 16:43 <a href="http://www.cnblogs.com/perhaps/archive/2010/05/03/1726442.html" target="_blank">原文链接</a></p><p>评论: 6　<a href="http://www.cnblogs.com/perhaps/archive/2010/05/03/1726442.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/perhaps/archive/2010/05/03/1726442.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>由XML Literal引发的思考</title><link>http://www.cnblogs.com/perhaps/archive/2010/04/24/1719023.html</link><dc:creator>FantasySoft</dc:creator><author>FantasySoft</author><pubDate>Fri, 23 Apr 2010 16:21:00 GMT</pubDate><guid>http://www.cnblogs.com/perhaps/archive/2010/04/24/1719023.html</guid><description><![CDATA[<p><p align="left">一年多没在首页露脸了，昨天凌晨写就了<a href="http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html" target="_blank">一篇有关IronPython的随笔</a>，发布的时候我确实有点诚惶诚恐。不过还好，至少引得几位朋友的围观，还能碰上老朋友<a href="http://www.cnblogs.com/RChen/" target="_blank">木野狐</a>，我心足矣！木野狐在评论中给我留下了一个非常棒的问题：&#8220;IronPython能否模拟或者接近vb.net的xml literal那样的语法？&#8221;尽管我对IronPython处理XML的能力自信满满，但是，面对XML Literal这样的词汇，我有点踌躇了。于是，我开始了一系列的研究。</p>
<p>首先，<strong>什么是XML Literal呢</strong>？原来，这是在VB.NET 9.0才引入的一个用于构建XML对象的新特性，并且只有VB.NET 9.0才支持。我们都知道，要创建XML树，可以使用Linq中的API，如下所示（代码出自<a href="http://blogs.msdn.com/wriju/archive/2008/02/07/vb-net-9-0-xml-literal.aspx" target="_blank">VB.NET 9.0: XML Literal</a>）：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">Dim</span><span style="color: #000000">&nbsp;_xml2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">New</span><span style="color: #000000">&nbsp;XElement(</span><span style="color: #800000">"</span><span style="color: #800000">ProcessList</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;_<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">New</span><span style="color: #000000">&nbsp;XElement(</span><span style="color: #800000">"</span><span style="color: #800000">Process</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;_<br />&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">New</span><span style="color: #000000">&nbsp;XAttribute(</span><span style="color: #800000">"</span><span style="color: #800000">ThreadCount</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">2</span><span style="color: #800000">"</span><span style="color: #000000">),&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Some&nbsp;Process</span><span style="color: #800000">"</span><span style="color: #000000">))</span></div></div>
<p>对于上述的代码，我们可以使用更简单的方式进行赋值，那就是直接将XML树写出来：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">Dim</span><span style="color: #000000">&nbsp;_xml&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Processes</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Process&nbsp;ThreadCount</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">2</span><span style="color: #800000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">Some&nbsp;Name</span><span style="color: #000000">&lt;/</span><span style="color: #000000">Process</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">Processes</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span></div></div>
<p>这就是VB.NET特有的XML Literal了。这个特性不仅仅简化了XElement构建的过程，更重要的是，我们可以在构建的过程中添加某些查询！譬如下面的代码（代码出自<a href="http://msdn.microsoft.com/en-us/library/bb384629.aspx" target="_blank">XML Literals Overview</a>）：</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('aede0573-828e-4ee8-ac9e-cd53e3968912')"><img style="display: none" id="code_img_closed_aede0573-828e-4ee8-ac9e-cd53e3968912" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img id="code_img_opened_aede0573-828e-4ee8-ac9e-cd53e3968912" class="code_img_opened" onclick="cnblogs_code_hide('aede0573-828e-4ee8-ac9e-cd53e3968912',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"> 
<div id="cnblogs_code_open_aede0573-828e-4ee8-ac9e-cd53e3968912">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #0000ff">Dim</span><span style="color: #000000">&nbsp;contact2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">contact</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">Patrick&nbsp;Hines</span><span style="color: #000000">&lt;/</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">%</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;From&nbsp;p&nbsp;</span><span style="color: #0000ff">In</span><span style="color: #000000">&nbsp;phoneNumbers2&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">Select</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">phone&nbsp;type</span><span style="color: #000000">=&lt;</span><span style="color: #000000">%</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.Type&nbsp;%</span><span style="color: #000000">&gt;&gt;&lt;</span><span style="color: #000000">%</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.Number&nbsp;%</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">phone</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">contact</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span></div></div></div>
<p>看到这些例子，我着实被震撼了。VB.NET对XML的支持力度可谓空前绝后了，甚至<a href="http://www.infoq.com/news/2007/03/CSharp-XML" target="_blank">一些忠实的C#拥趸都因此拜倒在VB.NET的石榴裙下</a>。<a href="http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/ba2883c0-b66b-4d5a-a272-de4e86c70bbb" target="_blank">C#社区也纷纷要求为C#增加XML Literal特性</a>，<a href="http://www.distribucon.com/blog/VBXMLLiteralSupportInC.aspx" target="_blank">更有甚者竭力找到了Anders为大家留下的后门</a>。对于XML Literal有兴趣的朋友，可以阅读以下几篇来自MSDN的文章：<a href="http://msdn.microsoft.com/en-us/library/bb384629.aspx" target="_blank">XML Literals Overview</a>和<a href="http://msdn.microsoft.com/en-us/library/bb384964.aspx" target="_blank">Embedded Expressions in XML</a>。</p>
<p>对于XML的处理，VB.NET有此锐器，那么IronPython是否有相似的工具呢？Michael搜肠刮肚、翻箱倒柜才找到本属于Python的minidom模块，其中的parseString方法拥有稍微接近的处理能力，但可惜的是，parseString方法返回的对象只能是Document对象，而非ELement，这也意味着parseString并不拥有XML Literal的魔力。</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">from</span><span style="color: #000000">&nbsp;xml.dom.minidom&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;parseString<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;xmlElement&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;parseString(</span><span style="color: #800000">"""</span><span style="color: #800000"><br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Processes&gt;<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Process&nbsp;ThreadCount="2"&gt;Some&nbsp;Name&lt;/Process&gt;<br />...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Processes&gt;<br />...&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"""</span><span style="color: #000000">)</span></div></div>
<p>上述代码在IronPython 2.6中执行，会出现错误。这是因为IronPython对minidom的移植还没有全部完成，缺失了某些模块。具体的workaround如下：<br />1、<a href="http://sourceforge.net/projects/fepy/files/" target="_blank">下载FePy</a>并且解压至某个目录，譬如D:\FePy；<br />2、将D:\FePy\Lib\pyexpat.py、 D:\FePy\Lib\xml\dom\expatbuilder.py、D:\FePy\Lib\xml\parsers\expat.py赋值到IronPython相对应的目录中。如第一个文件就复制到D:\IronPython 2.6\Lib的目录下；<br />3、搜索expatbuilder.py中的NewStyle变量，并且将其删除。</p>
<p>&nbsp;</p>
<p><strong>[后记：]</strong>一位在Youtube工作的牛人Fredrik Lundh<a href="http://effbot.org/zone/idea-xml-literal.htm" target="_blank">早在2002年就提出了为Python添加XML Literal的功能</a>，<strike>但是直到现在还没有出现类似的功能，至少Michael现在还没有找到</strike>。有发现的朋友请告知一声，衷心感谢！&nbsp;</p>
<p>经过<a href="http://hi.baidu.com/limodou" target="_blank">limodou兄</a>的指点，Michael找到了<a href="http://docs.python.org/library/xml.etree.elementtree.html" target="_blank">xml.etree.ElementTree模块</a>，其中的<a href="http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML" target="_blank">xml.etree.ElementTree.XML(text)方法</a>在一定程度实现XML Literal特性，毕竟它返回的是Element对象，那么我们就可以基于此进行操作了。xml.etree.ElementTree模块在IronPython 2.6下运行正常。</p> <img src="http://www.cnblogs.com/perhaps/aggbug/1719023.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/perhaps/" target="_blank">FantasySoft</a> 发表于 2010-04-24 00:21 <a href="http://www.cnblogs.com/perhaps/archive/2010/04/24/1719023.html" target="_blank">原文链接</a></p><p>评论: 2　<a href="http://www.cnblogs.com/perhaps/archive/2010/04/24/1719023.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/perhaps/archive/2010/04/24/1719023.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>作为.NET程序员，您需要IronPython么？</title><link>http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html</link><dc:creator>FantasySoft</dc:creator><author>FantasySoft</author><pubDate>Thu, 22 Apr 2010 18:00:00 GMT</pubDate><guid>http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html</guid><description><![CDATA[<p><p>.NET作为一个成熟的开发平台，为很多语言的发展提供了肥沃的土壤：历史相对久远的有Managed C++、C#、VB.NET、J#，正值壮年的则有IronPython、IronRuby，而<a href="http://www.cnblogs.com/jeffreyzhao" target="_blank">老赵</a>极力推崇的<a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx" target="_blank">F#</a>则是后起之秀了。面对那么多的语言，选择自然也是一个难题。在大部分开发人员眼中，C#是最为正统的.NET语言，它几乎是为.NET而生的，语言版本更替的速度与.NET Framework相比，一点都不含糊，这不，C# 4.0都出来了。因此，C#通常都是.NET开发人员的首选语言。但是，掌握了C#之后，如果您希望学习多一种语言以增强解决问题的能力；如果您希望了解更多有关编程范式的内容；如果您希望了解DLR甚至编译器的设计；如果您希望&#8230;&#8230;那么，<a href="http://ironpython.codeplex.com/" target="_blank">IronPython</a>将会是您的最佳选择，它就像是叮当的万能口袋，只要您伸手，您就会淘到想要的宝贝。</p>
<p>&nbsp;</p>
<p>有关IronPython的历史，我在这里就不赘述了。简单的说，它是Python语言在.NET上的实现，既保持了Python所崇尚的编程哲学（想了解它？打开IronPython的控制台，在提示符之后输入import this，出现在屏幕上的就是著名的<a href="http://python.org/dev/peps/pep-0020/" target="_blank">The Zen of Python</a>），又为.NET开发人员带来了新鲜的开发模式。IronPython与传统的.NET开发语言不同，它是一门解释型的动态语言，也是一门多范式编程语言。尽管解释型、动态与多范式都是非常简单的词汇，但是它能够为开发人员带来更为直接了当的解决方案。譬如，在C# 3.0才引入的Lambda表达式以及闭包（Closure），而IronPython早已极好地支持这些体现了函数式编程的特性。即便是现在，使用IronPython实现闭包、duck typing以及运行期绑定都要比C#和VB.NET来得更为直观。也许您对会&#8220;直观&#8221;这一点不以为然，而事实上，我们在编写程序的时候，除了要让计算机为我们工作之外，还要让他人能够轻松地阅读我们的代码。作为程序员，我们都知道代码的可读性以及可维护性是多么重要，如果从一个软件的生命周期来看，升级与维护是软件最大的开销。您还记得KISS原则么？是的，就是Keep It Simple &amp; Stupid。IronPython可以帮助我们实现这美妙的&#8220;亲吻&#8221;，真正去拥抱编程。</p>
<p>&nbsp;</p>
<p>除了为开发人员带来更高的生产力之外，IronPython的出现也让<a href="http://www.microsoft.com/china/net/news/07-11.NETframework.mspx" target="_blank">&#8220;.NET平台糅合各种编程语言&#8221;</a>真正实至名归。想必大家都会记得，早在.NET平台诞生之初，它所推崇的多语言协作理念是其最大的噱头。然而，.NET所述的多语言协作性仅仅体现在IL的层面上，那么在实际的项目开发当中，又会有谁愿意同时使用C#和VB.NET进行开发呢？由于IronPython是一门解释型语言，利用它来实现某些不稳定的业务逻辑就再适合不过了，省却了编译的过程，即改即运行。更重要的，我们可以在C#代码当中直接调用IronPython的代码！这些特性都让IronPython完全能够胜任C#左膀右臂的角色。</p>
<p>&nbsp;</p>
<p>听Michael罗嗦了那么多，您是否觉得IronPython正是自己的新欢呢？觉得上述文字空洞无物？好吧，最后给大家送上两段代码，Code will tell.</p>
<p>&nbsp;</p>
<p>代码一，实现了&#8220;把一个字符串数组中的元素转化为整数，再将其中的偶数放入一个List&lt;int&gt;容器中&#8221;的功能，C#版的代码可以参考<a href="http://www.cnblogs.com/jeffreyzhao" target="_blank">老赵</a>的文章<a href="http://www.cnblogs.com/jeffreyzhao/archive/2009/06/27/try-to-make-a-better-csharp-2.html" target="_blank">《拯救C# 2.0，但是我们真做的到吗？》</a>：</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<div><!--<br/ />
<br/ />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />
http://www.CodeHighlighter.com/<br/ />
<br/ />
--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;strArray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #800000">"</span><span style="color: #800000">1</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">2</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">3</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">4</span><span style="color: #800000">"</span><span style="color: #000000">]<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;intArray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[int(i)&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;strArray&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;int(i)&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;0]</span></div></div>
<p>&nbsp;</p>
<p>代码二，实现了&#8220;找出长度较短的字符串&#8221;的功能，C#版的代码可以参考<a href="http://www.cnblogs.com/klesh" target="_blank">Klesh.Cn</a>精心翻译的好文：<a href="http://www.cnblogs.com/klesh/archive/2008/05/15/the-beauty-of-closures.html" target="_blank">C#和Java的闭包－Jon谈《The Beauty of Closures》</a> 中的Example2b.cs 和Example2c.cs：</p>
<div class="cnblogs_code">
<div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;SampleData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">quick</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">brown</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fox</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">jumped</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #800000">"</span><span style="color: #800000">over</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">the</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">lazy</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">dog</span><span style="color: #800000">"</span><span style="color: #000000">]<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;maxLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;raw_input(</span><span style="color: #800000">"</span><span style="color: #800000">Maximum&nbsp;length&nbsp;of&nbsp;string&nbsp;to&nbsp;include?</span><span style="color: #800000">"</span><span style="color: #000000">)&nbsp;<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;maxLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;int(maxLength)<br /></span><span style="color: #000000">&gt;&gt;&gt;</span><span style="color: #000000">&nbsp;shortWords&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[i&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;SampleData&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;len(i)&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;maxLength]</span></div></div>
<p>&nbsp;</p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/perhaps/aggbug/1718261.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/perhaps/" target="_blank">FantasySoft</a> 发表于 2010-04-23 02:00 <a href="http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html" target="_blank">原文链接</a></p><p>评论: 24　<a href="http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/perhaps/archive/2010/04/23/1718261.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IronPython 承载和消费WCF服务</title><link>http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html</link><dc:creator>张善友</dc:creator><author>张善友</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><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="http://www.cnblogs.com/shanyou/aggbug/1656973.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2010-01-26 20:32 <a href="http://www.cnblogs.com/shanyou/archive/2010/01/26/1656973.html" target="_blank">原文链接</a></p><p>评论: 4　<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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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/1629692.html</link><dc:creator>张善友</dc:creator><author>张善友</author><pubDate>Tue, 22 Dec 2009 05:09:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2009/12/22/1629692.html</guid><description><![CDATA[<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="http://www.cnblogs.com/shanyou/aggbug/1629692.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2009-12-22 13:09 <a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/1629692.html" target="_blank">原文链接</a></p><p>评论: 4　<a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/1629692.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2009/12/22/1629692.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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>张善友</dc:creator><author>张善友</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><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="http://www.cnblogs.com/shanyou/aggbug/1565104.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2009-09-12 07:05 <a href="http://www.cnblogs.com/shanyou/archive/2009/09/12/1565104.html" target="_blank">原文链接</a></p><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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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><img src="http://www.cnblogs.com/RChen/aggbug/1530040.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/RChen/" 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><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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><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://q.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><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="http://www.cnblogs.com/redmoon/aggbug/1486205.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/redmoon/" 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>评论: 6　<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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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/1419250.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/1419250.html</guid><description><![CDATA[<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="http://www.cnblogs.com/JeffreyZhao/aggbug/1419250.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/JeffreyZhao/" target="_blank">Jeffrey Zhao</a> 发表于 2009-03-25 09:03 <a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/1419250.html" target="_blank">原文链接</a></p><p>评论: 21　<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/1419250.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/25/1419250.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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>张善友</dc:creator><author>张善友</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><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="http://www.cnblogs.com/shanyou/aggbug/1393517.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2009-02-18 22:26 <a href="http://www.cnblogs.com/shanyou/archive/2009/02/18/1393517.html" target="_blank">原文链接</a></p><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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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>张善友</dc:creator><author>张善友</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><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="http://www.cnblogs.com/shanyou/aggbug/1355258.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2008-12-15 13:19 <a href="http://www.cnblogs.com/shanyou/archive/2008/12/15/1355258.html" target="_blank">原文链接</a></p><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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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>张善友</dc:creator><author>张善友</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><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="http://www.cnblogs.com/shanyou/aggbug/1325005.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2008-11-02 20:34 <a href="http://www.cnblogs.com/shanyou/archive/2008/11/02/1325005.html" target="_blank">原文链接</a></p><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/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.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/1303644.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/1303644.html</guid><description><![CDATA[<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="http://www.cnblogs.com/Cajon/aggbug/1303644.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/Cajon/" target="_blank">Colin Han</a> 发表于 2008-10-06 10:08 <a href="http://www.cnblogs.com/Cajon/archive/2008/10/06/1303644.html" target="_blank">原文链接</a></p><p>评论: 9　<a href="http://www.cnblogs.com/Cajon/archive/2008/10/06/1303644.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/Cajon/archive/2008/10/06/1303644.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IronPython 2.0 beta 5</title><link>http://www.cnblogs.com/shanyou/archive/2008/09/29/1302015.html</link><dc:creator>张善友</dc:creator><author>张善友</author><pubDate>Mon, 29 Sep 2008 07:50:00 GMT</pubDate><guid>http://www.cnblogs.com/shanyou/archive/2008/09/29/1302015.html</guid><description><![CDATA[<p><p>ironpython 2.0 beta 5 已经发布，下载地址：<a title="http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=15625" href="http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=15625">http://www.codeplex.com/IronPython/Release/ProjectReleases.aspx?ReleaseId=15625</a>。IronPython 2.0 Beta 5是2.0系列的最后一个beta版本，下个版本就是RC版了。也就是说到了下个版本所有API都将固化了。现在也是到学习IronPython 2的时间了。从beta 4发布就有了msi 安装文件,并且带来了<strong>python的标准库</strong> ,标准库的许可是以Python Software Foundation license 发布，这也就意味着移值cpython应用会很容易了。</p>
<p>值得注意的是带来了DLR hosting spec 的稳定版本，你可以从这里下载 DLR hosting spec的word 版本 <a href="http://compilerlab.members.winisp.net/dlr-spec-hosting.doc">http://compilerlab.members.winisp.net/dlr-spec-hosting.doc</a></p>
<p>这个版本还有一个最明显的变化的是命名空间作了个重大的修改，把所有的DLR 类型从System移到了Microsoft，原因是<a href="http://lists.ironpython.com/pipermail/users-ironpython.com/2008-August/thread.html#8036">http://lists.ironpython.com/pipermail/users-ironpython.com/2008-August/thread.html#8036</a> 许多人把IronPython嵌入到C# （.NET 3.5）项目中。</p>
<p>另外一点是DLR 宿主API不有一个针对Python的默认配置，现在应该用IronPython.Hosting.Python去创建脚本引擎，这样在应用程序中宿主IronPython就更容易了。IronPython.Hosting.Python有几个辅助方法，以创建一个ScriptRuntime或ScriptEngine ，并为ScriptRuntime和ScriptEngine增加了一些Python-specific 扩展方法。 </p>
<p>using IronPython.Hosting;
<p>ScriptEngine engine = Python.CreateEngine();
<p>ScriptScope sys = engine.GetSysModule();<br />
var platform = sys.GetVariable("platform");<br />
Console.WriteLine(platform);
<p>ScriptScope builtins = engine.GetBuiltinModule();<br />
var pow = builtins.GetVariable&lt;Func&lt;double, double,double&gt;&gt;("pow");<br />
Console.WriteLine(pow(2,3));
<p>ScriptScope clr = engine.GetClrModule();<br />
var getPythonType = clr.GetVariable&lt;Func&lt;Type, PythonType&gt;&gt;("GetPythonType");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
Console.WriteLine(PythonType.Get__name__(getPythonType(typeof(string))));
<p>引用：<a title="http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx" href="http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx">http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx</a></p>
<p>如何在托管语言中调用动态语言。 </p>
<p>首先，我们需要初始化动态语言的环境配置，从中获取所有可以使用的动态语言列表，然后得到相应动态语言的运行引擎。</p>
<p><span style="color: rgb(43,145,175)">ScriptRuntimeSetup</span>&nbsp;setup&nbsp;=&nbsp;<span style="color: rgb(0,0,255)">new</span>&nbsp;<span style="color: rgb(43,145,175)">ScriptRuntimeSetup</span>(<span style="color: rgb(0,0,255)">true</span>);&nbsp;<span style="color: rgb(0,128,0)">//true表示载入所有支持的动态语言的环境配置</span><br />
<span style="color: rgb(43,145,175)">ScriptRuntime</span>&nbsp;runtime&nbsp;=&nbsp;<span style="color: rgb(43,145,175)">ScriptRuntime</span>.Create(setup);&nbsp;<span style="color: rgb(0,128,0)">//创建动态语言运行环境</span><br />
<br />
<span style="color: rgb(0,0,255)">foreach</span>&nbsp;(<span style="color: rgb(43,145,175)">LanguageProviderSetup</span>&nbsp;langSetup&nbsp;<span style="color: rgb(0,0,255)">in</span>&nbsp;setup.LanguageProviders)&nbsp;<span style="color: rgb(0,128,0)">//遍历所有动态语言的环境配置</span><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">try</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(43,145,175)">ScriptEngine</span>&nbsp;engine&nbsp;=&nbsp;<span style="color: rgb(0,0,255)">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span>&nbsp;(runtime.TryGetEngine(langSetup.Names[0],&nbsp;<span style="color: rgb(0,0,255)">out</span>&nbsp;engine))&nbsp;<span style="color: rgb(0,128,0)">//尝试获取动态语言的运行引擎</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,128,0)">//engine就是我们需要的运行引擎</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">catch</span>&nbsp;(<span style="color: rgb(43,145,175)">MissingTypeException</span>)&nbsp;<span style="color: rgb(0,128,0)">//处理创建不支持的动态语言时可能抛出异常</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</p>
<p>获取了运行引擎后，我们就可以执行动态语言的代码了</p>
<p><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">class</span>&nbsp;<span style="color: rgb(43,145,175)">MyErrorSink</span>&nbsp;:&nbsp;<span style="color: rgb(43,145,175)">ErrorSink<font color="#000000">&nbsp;</font><span style="color: rgb(0,128,0)">//编译错误处理</span></span><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(43,145,175)">IList</span>&lt;<span style="color: rgb(0,0,255)">string</span>&gt;&nbsp;m_ErrorMsg&nbsp;=&nbsp;<span style="color: rgb(0,0,255)">new</span>&nbsp;<span style="color: rgb(43,145,175)">List</span>&lt;<span style="color: rgb(0,0,255)">string</span>&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(43,145,175)">IList</span>&lt;<span style="color: rgb(0,0,255)">string</span>&gt;&nbsp;ErrorMsg<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">get</span>&nbsp;{&nbsp;<span style="color: rgb(0,0,255)">return</span>&nbsp;m_ErrorMsg;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">public</span>&nbsp;MyErrorSink()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">virtual</span>&nbsp;<span style="color: rgb(0,0,255)">void</span>&nbsp;Add(<span style="color: rgb(43,145,175)">SourceUnit</span>&nbsp;source,&nbsp;<span style="color: rgb(0,0,255)">string</span>&nbsp;message,&nbsp;<span style="color: rgb(43,145,175)">SourceSpan</span>&nbsp;span,&nbsp;<span style="color: rgb(0,0,255)">int</span>&nbsp;errorCode,&nbsp;<span style="color: rgb(43,145,175)">Severity</span>&nbsp;severity)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span>&nbsp;(severity&nbsp;==&nbsp;<span style="color: rgb(43,145,175)">Severity</span>.Error&nbsp;||&nbsp;severity&nbsp;==&nbsp;<span style="color: rgb(43,145,175)">Severity</span>.FatalError)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ErrorMsg.Add(message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</p>
<p><span style="color: rgb(43,145,175)">LanguageContext</span>&nbsp;langContext&nbsp;=&nbsp;<span style="color: rgb(43,145,175)">HostingHelpers</span>.GetLanguageContext(engine);<br />
<span style="color: rgb(43,145,175)">SourceUnit</span>&nbsp;sourceUnit&nbsp;=&nbsp;langContext.CreateSourceUnit(<span style="color: rgb(0,0,255)">new</span>&nbsp;<span style="color: rgb(43,145,175)">SourceStringContentProvider</span>(<span style="color: rgb(163,21,21)">"1/4+3"</span>),&nbsp;<span style="color: rgb(0,0,255)">null</span>,&nbsp;<span style="color: rgb(43,145,175)">SourceCodeKind</span>.Expression);&nbsp;<span style="color: rgb(0,128,0)">//创建代码序列：1/4+3</span><br />
<br />
<span style="color: rgb(43,145,175)">MyErrorSink</span>&nbsp;errorSink&nbsp;=&nbsp;<span style="color: rgb(0,0,255)">new</span>&nbsp;<span style="color: rgb(43,145,175)">MyErrorSink</span>();<br />
<span style="color: rgb(0,0,255)">try</span><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(43,145,175)">Scope</span>&nbsp;scope&nbsp;=&nbsp;<span style="color: rgb(0,0,255)">new</span>&nbsp;<span style="color: rgb(43,145,175)">Scope</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">object</span>&nbsp;ret&nbsp;=&nbsp;sourceUnit.Execute(scope,&nbsp;errorSink);&nbsp;<span style="color: rgb(0,128,0)">//执行动态语言代码，ret就是执行结果的返回值了</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">if</span>&nbsp;(errorSink.ErrorMsg.Count&nbsp;&gt;&nbsp;0)&nbsp;<span style="color: rgb(0,128,0)">//检查编译错误</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(43,145,175)"><span style="color: rgb(0,128,0)">//</span></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<span style="color: rgb(0,0,255)">catch</span>&nbsp;(<span style="color: rgb(43,145,175)">Exception</span>)<br />
{<br />
}<br />
</p>
<p>引用: <a href="http://blogs.msdn.com/silverlightshanghai/archive/2008/09/18/dlr-in-silverlight.aspx">http://blogs.msdn.com/silverlightshanghai/archive/2008/09/18/dlr-in-silverlight.aspx</a><a href="http://compilerlab.members.winisp.net/dlr-spec-hosting.doc"></a></p>
<img src="http://www.cnblogs.com/shanyou/aggbug/1302015.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/shanyou/" target="_blank">张善友</a> 发表于 2008-09-29 15:50 <a href="http://www.cnblogs.com/shanyou/archive/2008/09/29/1302015.html" target="_blank">原文链接</a></p><p>评论: 2　<a href="http://www.cnblogs.com/shanyou/archive/2008/09/29/1302015.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/shanyou/archive/2008/09/29/1302015.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><br/></p><p>编辑推荐：<a href="http://kb.cnblogs.com/page/120592/" target="_blank">Ruby之父松本行弘的编程人生</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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IronPython for ASP.NET 的支持更新了</title><link>http://www.cnblogs.com/RChen/archive/2008/09/24/1298241.html</link><dc:creator>木野狐(Neil Chen)</dc:creator><author>木野狐(Neil Chen)</author><pubDate>Wed, 24 Sep 2008 09:40:00 GMT</pubDate><guid>http://www.cnblogs.com/RChen/archive/2008/09/24/1298241.html</guid><description><![CDATA[<p><img src="http://www.cnblogs.com/RChen/aggbug/1298241.html?type=1" width="1" height="1" alt=""/><p>作者: <a href="http://www.cnblogs.com/RChen/" target="_blank">木野狐(Neil Chen)</a> 发表于 2008-09-24 17:40 <a href="http://www.cnblogs.com/RChen/archive/2008/09/24/1298241.html" target="_blank">原文链接</a></p><p>评论: 3　<a href="http://www.cnblogs.com/RChen/archive/2008/09/24/1298241.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/RChen/archive/2008/09/24/1298241.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/129385/" target="_blank">Jon Rubinstein 暂别科技舞台：再见，HP</a><span style="color:gray">(2012-01-28 21:36)</span><br/>· <a href="http://news.cnblogs.com/n/129384/" target="_blank">塞班3设备更新换代 诺基亚Belle出货</a><span style="color:gray">(2012-01-28 21:34)</span><br/>· <a href="http://news.cnblogs.com/n/129383/" target="_blank">推土机Windows 7补丁权威测试</a><span style="color:gray">(2012-01-28 19:24)</span><br/>· <a href="http://news.cnblogs.com/n/129382/" target="_blank">诺基亚在印度：品牌优势，渠道特点，跟中国的对比</a><span style="color:gray">(2012-01-28 19:21)</span><br/>· <a href="http://news.cnblogs.com/n/129381/" target="_blank">世界最早的计算机密码和黑客</a><span style="color:gray">(2012-01-28 19:20)</span><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://q.cnblogs.com/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>
