﻿<?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>博客园-飘遥的Blog</title><link>http://www.cnblogs.com/zxjay/</link><description>-专注于.NET开发</description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 03:33:18 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 03:33:18 GMT</pubDate><ttl>60</ttl><item><title>仿Win7显示桌面的工具</title><link>http://www.cnblogs.com/zxjay/archive/2010/01/30/1659611.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Fri, 29 Jan 2010 20:42:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2010/01/30/1659611.html</guid><description><![CDATA[<p>阅读: 1881 评论: 14 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2010-01-30 04:42 <a href="http://www.cnblogs.com/zxjay/archive/2010/01/30/1659611.html" target="_blank">原文链接</a></p><br />
&nbsp;Win7改进了许多用户体验，其中右下角显示桌面的按钮是最舒心的功能之一。为了在没装Win7的开发机上体验这个功能，写了下面的小工具。<br />
Win7中，鼠标拖到最右下角，点击左键，便可以显示桌面。<br />
<img width="484" height="366" alt="" src="http://www.xianfen.net/Upload/img_big/2010013004024463.jpg" /><br />
在用户体验上，右下角是一个无限大的区域(黄色边框范围)，因为鼠标被限制在屏幕范围内；与屏幕中某块孤立范围相比，操作的命中率大大提高。<br />
要实现这样的工具，思路非常简单：取得屏幕分辨率；在最右下角放置按钮或类似控件；点击时触发显示桌面；OK。当然还有一些细节如任务栏并不一定是在屏幕下方；最好不要影响到用户的正常操作，在用户不想看的时候甚至不要让用户看到；设置开机自动启动等。<br />
<br />
按照这样的思路一点点实现即可。<br />
取得任务栏，在上面添加子窗口：<br />
<div style="border:dashed 1px #ff9966;padding:10px;background:#ffffdd; line-height:1.2em;"><span style="color: #000000;">hWndTray </span><span style="color: #000000;">=</span><span style="color: #000000;"> FindWindow(TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">Shell_TrayWnd</span><span style="color: #800000;">"</span><span style="color: #000000;">), NULL); <br />
<br />
CreateWindow(szWindowClass, szTitle, WS_CHILD, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWndTray, NULL, hInstance, NULL);</span></div>
<br />
根据任务栏的位置不同，设置子窗口的位置及大小：<br />
<div style="border:dashed 1px #ff9966;padding:10px;background:#ffffdd; line-height:1.2em;"><span style="color: #000000;">RECT rectTray, rectWnd; <br />
</span><span style="color: #0000FF;">const</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> CTL_LENGTH </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">10</span><span style="color: #000000;">; <br />
<br />
</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">GetWindowRect(hWndTray, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">rectTray)) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hWnd, TEXT(</span><span style="color: #800000;">"</span><span style="color: #800000;">Get task bar size failed!</span><span style="color: #800000;">"</span><span style="color: #000000;">), szTitle, MB_OK); <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">return</span><span style="color: #000000;"> FALSE; <br />
} <br />
<br />
</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(rectTray.bottom </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectTray.top </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> rectTray.right </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectTray.left) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">horizon</span><span style="color: #008000;"> <br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> rectTray.right </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectTray.left </span><span style="color: #000000;">-</span><span style="color: #000000;"> CTL_LENGTH; <br />
&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> rectWnd.left </span><span style="color: #000000;">+</span><span style="color: #000000;"> CTL_LENGTH; <br />
&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.top </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.bottom </span><span style="color: #000000;">=</span><span style="color: #000000;"> rectTray.bottom </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectTray.top; <br />
} <br />
</span><span style="color: #0000FF;">else</span><span style="color: #000000;"> <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">vertical</span><span style="color: #008000;"> <br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.left </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800080;">0</span><span style="color: #000000;">; <br />
&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.right </span><span style="color: #000000;">=</span><span style="color: #000000;"> rectTray.right </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectTray.left; <br />
&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.top </span><span style="color: #000000;">=</span><span style="color: #000000;"> rectTray.bottom </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectTray.top </span><span style="color: #000000;">-</span><span style="color: #000000;"> CTL_LENGTH; <br />
&nbsp;&nbsp;&nbsp;&nbsp;rectWnd.bottom </span><span style="color: #000000;">=</span><span style="color: #000000;"> rectWnd.top </span><span style="color: #000000;">+</span><span style="color: #000000;"> CTL_LENGTH; <br />
} <br />
<br />
SetWindowPos(hWnd, NULL, rectWnd.left, rectWnd.top, rectWnd.right </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectWnd.left, rectWnd.bottom </span><span style="color: #000000;">-</span><span style="color: #000000;"> rectWnd.top, </span><span style="color: #800080;">0</span><span style="color: #000000;">);&nbsp;<br />
</span></div>
<br />
显示桌面调用SHELL的COM对象。<br />
<div style="border:dashed 1px #ff9966;padding:10px;background:#ffffdd; line-height:1.2em;"><span style="color: #000000;">IShellDispatch4 </span><span style="color: #000000;">*</span><span style="color: #000000;"> pshDsp4; <br />
CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (VOID</span><span style="color: #000000;">**</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">pshDsp4); <br />
pshDsp4 </span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">ToggleDesktop();</span></div>
<br />
如果设置为自动运行，在注册表HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run下添加键值。<br />
在程序运行中，如果主题修改或任务栏位置修改，需要更新窗口的位置，处理WM_SETTINGCHANGE消息即可。<br />
<br />
要使子窗口透明，程序实现上比较麻烦，可以阻止系统对WM_ERASEBKGND消息的默认处理，以达到窗口&#8220;透明&#8221;的目的(不处理背景重绘，当然某些情况下会显示不正常)。<br />
<br />
最终运行截图：(点右键显示的菜单)<br />
<img width="161" height="140" alt="" src="http://www.xianfen.net/Upload/img_big/2010013004025775.jpg" /><br />
<br />
在WinXP，Win7简单测试通过。<br />
<br />
源码及可执行程序下载：<a target="_blank" href="http://www.xianfen.net/File36.aspx">点击下载</a><br />
<br type="_moz" /><img src="http://www.cnblogs.com/zxjay/aggbug/1659611.html?type=1" width="1" height="1" alt=""/><p>评论: 14　<a href="http://www.cnblogs.com/zxjay/archive/2010/01/30/1659611.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2010/01/30/1659611.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Deep Zoom Composer初探</title><link>http://www.cnblogs.com/zxjay/archive/2009/08/16/Xianfen_Net_Silverlight_Deep_Zoom_Composer.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Sun, 16 Aug 2009 09:50:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/08/16/Xianfen_Net_Silverlight_Deep_Zoom_Composer.html</guid><description><![CDATA[<p>阅读: 71 评论: 0 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-08-16 17:50 <a href="http://www.cnblogs.com/zxjay/archive/2009/08/16/Xianfen_Net_Silverlight_Deep_Zoom_Composer.html" target="_blank">原文链接</a></p>安装Win7 RTM后发现很好用，查了下MS OS历史，顺手试验了一下Deep Zoom Composer，做了个查看MS OS历史的Silverlight应用。<br />运行效果：<br /><a href="http://www.xianfen.net/Article131.aspx">http://www.xianfen.net/Article131.aspx</a><br />(貌似这里不能用iframe嵌入)<br />以上实现没有进行任何编码，并且生成的文件不再像以前的二进制格式，而是XML格式的纯文本件。<br />MS OS历史资料来源：<a href="http://www.levenez.com/windows" target="_blank">http://www.levenez.com/windows</a><br /><img src="http://www.cnblogs.com/zxjay/aggbug/1547444.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/zxjay/archive/2009/08/16/Xianfen_Net_Silverlight_Deep_Zoom_Composer.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/08/16/Xianfen_Net_Silverlight_Deep_Zoom_Composer.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>ASP.NET VirtualPathProvider (下)</title><link>http://www.cnblogs.com/zxjay/archive/2009/07/26/Xianfen_Net_VirtualPathProvider_2.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Sun, 26 Jul 2009 11:42:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/07/26/Xianfen_Net_VirtualPathProvider_2.html</guid><description><![CDATA[<p>阅读: 209 评论: 0 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-07-26 19:42 <a href="http://www.cnblogs.com/zxjay/archive/2009/07/26/Xianfen_Net_VirtualPathProvider_2.html" target="_blank">原文链接</a></p>上一篇介绍了VirtualPathProvider中虚拟文件的实现，参考：<a href="http://www.xianfen.net/Article100.aspx" target="_blank">ASP.NET VirtualPathProvider (上)</a>。<br />文件系统中，只有文件是不完整的，还要有目录。本篇介绍VirtualPathProvider中的虚拟目录实现。<br /><br /><span style="font-size: small"><strong>实现代码：<br /></strong></span>
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">using</span><span style="color: #000000"> System.Collections; <br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> System.IO; <br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> System.Text; <br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> System.Text.RegularExpressions; <br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> System.Web; <br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> System.Web.Caching; <br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> System.Web.Hosting; <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.MyVirtualPathProvider_Directory <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> MyVirtualPathProvider : VirtualPathProvider <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> AppInitialize() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HostingEnvironment.RegisterVirtualPathProvider(</span><span style="color: #0000ff">new</span><span style="color: #000000"> MyVirtualPathProvider()); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000"> IsVirtualFile(</span><span style="color: #0000ff">string</span><span style="color: #000000"> vPath) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> Regex.IsMatch(vPath, </span><span style="color: #800000">@"</span><span style="color: #800000">.*vfile\d{1}\.aspx</span><span style="color: #800000">"</span><span style="color: #000000">, RegexOptions.IgnoreCase); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000"> IsVirtualDirectory(</span><span style="color: #0000ff">string</span><span style="color: #000000"> vPath) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000"> relativePath </span><span style="color: #000000">=</span><span style="color: #000000"> VirtualPathUtility.ToAppRelative(vPath); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> Regex.IsMatch(relativePath, </span><span style="color: #800000">@"</span><span style="color: #800000">~/vdir\d{1}/.*</span><span style="color: #800000">"</span><span style="color: #000000">, RegexOptions.IgnoreCase); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">bool</span><span style="color: #000000"> FileExists(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualPath) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (IsVirtualFile(virtualPath)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">true</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> Previous.FileExists(virtualPath); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> CacheDependency GetCacheDependency(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualPath, IEnumerable virtualPathDependencies, System.DateTime utcStart) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (IsVirtualFile(virtualPath)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">null</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">base</span><span style="color: #000000">.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> </span><span style="color: #0000ff">bool</span><span style="color: #000000"> DirectoryExists(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualDir) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (IsVirtualDirectory(virtualDir)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">true</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">base</span><span style="color: #000000">.DirectoryExists(virtualDir); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> VirtualDirectory GetDirectory(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualDir) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (IsVirtualDirectory(virtualDir)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> MyVirtualDirectory(virtualDir); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> Previous.GetDirectory(virtualDir); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> VirtualFile GetFile(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualPath) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtualPath </span><span style="color: #000000">=</span><span style="color: #000000"> virtualPath.ToLower(); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (IsVirtualFile(virtualPath)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> MyVirtualFile(virtualPath); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> Previous.GetFile(virtualPath); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />} <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.MyVirtualPathProvider_Directory <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> MyVirtualFile : VirtualFile <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000"> myPath; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> MyVirtualFile(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualPath) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </span><span style="color: #0000ff">base</span><span style="color: #000000">(virtualPath) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myPath </span><span style="color: #000000">=</span><span style="color: #000000"> virtualPath; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> Stream Open() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream stream </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> MemoryStream(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamWriter sw </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> StreamWriter(stream); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamReader sr </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000"> content </span><span style="color: #000000">=</span><span style="color: #000000"> File.ReadAllText(HttpContext.Current.Server.MapPath(</span><span style="color: #800000">"</span><span style="color: #800000">~/App_Data/htm.txt</span><span style="color: #800000">"</span><span style="color: #000000">), Encoding.UTF8); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content </span><span style="color: #000000">=</span><span style="color: #000000"> content.Replace(</span><span style="color: #800000">"</span><span style="color: #800000">$currentfile$</span><span style="color: #800000">"</span><span style="color: #000000">, myPath); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Write(content); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Flush(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.Seek(</span><span style="color: #800080">0</span><span style="color: #000000">, SeekOrigin.Begin); <br /><br />&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"> stream; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&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"> (sr </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sr.Close(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sr.Dispose(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> MyVirtualDirectory : VirtualDirectory <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000"> vDir </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList children </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ArrayList(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList dirs </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ArrayList(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList files </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ArrayList(); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> MyVirtualDirectory(</span><span style="color: #0000ff">string</span><span style="color: #000000"> virtualDirectory) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: </span><span style="color: #0000ff">base</span><span style="color: #000000">(virtualDirectory) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vDir </span><span style="color: #000000">=</span><span style="color: #000000"> virtualDirectory; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitData(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> InitData() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #0000ff">string</span><span style="color: #000000">.IsNullOrEmpty(vDir)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir1</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir2</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir3</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir4</span><span style="color: #800000">"</span><span style="color: #000000">); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirs.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir1</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirs.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir2</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirs.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir3</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dirs.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vdir4</span><span style="color: #800000">"</span><span style="color: #000000">); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile1.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile2.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile3.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile4.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile1.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile2.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile3.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile4.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile1.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile2.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile3.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile4.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile1.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile2.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile3.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.Add(</span><span style="color: #800000">"</span><span style="color: #800000">vfile4.aspx</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> System.Collections.IEnumerable Children <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"> { </span><span style="color: #0000ff">return</span><span style="color: #000000"> children; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> System.Collections.IEnumerable Directories <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"> { </span><span style="color: #0000ff">return</span><span style="color: #000000"> dirs; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">override</span><span style="color: #000000"> System.Collections.IEnumerable Files <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"> { </span><span style="color: #0000ff">return</span><span style="color: #000000"> files; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />} <br /></span></div><br />首先定义了虚拟路径提供者，然后实现了虚拟文件和虚拟目录。值得一提的是，实现虚拟路径时，必须重载VirtualPathProvider的GetCacheDependency方法，可以实现自己的CacheDependency或直接返回null，否则会抛出找不到目录的异常。<br /><br />运行截图：<br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009072619381422.jpg" width="309" height="379" /><br /><br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009072619383198.jpg" width="345" height="193" /> <img src="http://www.cnblogs.com/zxjay/aggbug/1531519.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/zxjay/archive/2009/07/26/Xianfen_Net_VirtualPathProvider_2.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/07/26/Xianfen_Net_VirtualPathProvider_2.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Silverlight3离线运行</title><link>http://www.cnblogs.com/zxjay/archive/2009/07/17/1525847.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Fri, 17 Jul 2009 11:21:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/07/17/1525847.html</guid><description><![CDATA[<p>阅读: 268 评论: 0 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-07-17 19:21 <a href="http://www.cnblogs.com/zxjay/archive/2009/07/17/1525847.html" target="_blank">原文链接</a></p>Silverlight3几天前正式发布了，没有带来期待的惊喜。如果说Silverlight1是试验品，Silverlight2是半成品，那么Silverlight3就是半成品加补丁。难怪MS对Silverlight3的发布那么低调。<br />VS还是不支持可视化设计；3D功能太弱；离线运行很勉强；其他新特性几乎都是原有功能的补丁。<br /><br />设置离线功能:<br />右键点击项目属性，可以看到Silverlight build options<br />选中Enable running application out of the browser.<br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009071712534673.png" width="524" height="193" /><br /><br />可以点击Out-of-Browser Settings设置其它一些属性(有个复选框，是否启用GPU加速)。<br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009071712553753.png" width="510" height="517" /><br /><br />运行项目，点击鼠标右键，可以看到有个快捷菜单:是否将XXXX安装到此计算机。点击后打开对话框：<br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009071712540954.png" width="497" height="283" /><br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009071712541886.png" width="456" height="195" /><br /><br />确定后可以看到在开始菜单或桌面创建了快捷方式，打开可以运行，如果想删除，可以在快捷菜单中选择删除。<br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009071712542846.png" width="421" height="340" /><br /><br />打开快捷方式的属性，可以看到目标为："C:\Program Files\Microsoft Silverlight\sllauncher.exe" 2217010316.localhost<br />其存储位置为：<br />C:\DOCUMENTS AND SETTINGS\ZHENXINGZ\LOCAL SETTINGS\APPLICATION DATA\MICROSOFT\SILVERLIGHT\OUTOFBROWSER\2217010316.LOCALHOST<br />(2217010316这串数字是随机的。)<br /><br />示例：<br /><br />
<div style="width: 100%">
<object data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAIAABraQAArTMAAAwAAAB3AGgAaQB0AGUAAAAAAAAAAAAAAAAAAAA0AAAALwBGAGkAbABlAHMALwB6AHgAagBhAHkALwBUAGUAcwB0ADMARAAzAEUALgB4AGEAcAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAABgAAAAzAC4AMAAuADQAMAA2ADIANAAuADAAAAAKAAAAdAByAHUAZQAAAAAAAAAAAAAAAAAAAA==" width="100%" height="500" type="application/x-silverlight-2">
<param value="/Files/zxjay/Test3D3E.xap" name="source"   />
<param value="white" name="background"   />
<param value="3.0.40624.0" name="minRuntimeVersion"   />
<param value="true" name="autoUpgrade"   /><a style="text-decoration: none" href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0"><img alt="Get Microsoft Silverlight" style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" src="http://go.microsoft.com/fwlink/?LinkId=108181"  /> </a></object></div><img src="http://www.cnblogs.com/zxjay/aggbug/1525847.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/zxjay/archive/2009/07/17/1525847.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/07/17/1525847.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>[译]理解Windows消息循环</title><link>http://www.cnblogs.com/zxjay/archive/2009/06/27/1512372.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Sat, 27 Jun 2009 10:15:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/06/27/1512372.html</guid><description><![CDATA[<p>阅读: 452 评论: 2 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-06-27 18:15 <a href="http://www.cnblogs.com/zxjay/archive/2009/06/27/1512372.html" target="_blank">原文链接</a></p>理解消息循环和整个消息传送机制对Windows编程来说非常重要。如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方。<br /><br /><strong><span style="font-size: small">什么是消息(Message)<br /></span></strong><br />每个消息是一个整型数值，如果查看头文件(查看头文件了解API是一个非常好的习惯和普遍的做法)可以发现如下一些宏定义：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">#define</span><span style="color: #000000"> WM_INITDIALOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0110</span><span style="color: #000000"> <br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> WM_COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0111</span><span style="color: #000000"> <br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> WM_LBUTTONDOWN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0201</span><span style="color: #000000"> <br /></span><span style="color: #008000">//</span><span style="color: #008000">...</span></div><br />在Windows通信中，至少一些基本Windows通信，几乎都要用到消息。如果你想让窗口或控件(实质上，控件是特殊的窗口)执行何种动作，你应该传送一个消息给它；如果另一个窗口想让你执行何种操作，它可以传送一个消息给你。如果一个事件，如敲击键盘、移动鼠标、点击按钮等，系统将消息传送给窗口，如果你是这些窗口之一，你将接收到消息执行相应的操作。<br /><br />每个Windows消息共有两个参数，wParam和lParam。最初的wParam是16位(Win16时代)的，lParam是32位的。在Win32中，两个参数都是32位的。并不是所有的消息都是用这两个参数，每个消息使用它们的方式也不尽相同。如WM_CLOSE消息会忽略上述两个参数；再如WM_COMMAND消息使用上述两个参数，wParam包含&#8221;两个&#8221;值，HIWORD(wParam)是通知信息(如果可用)，LOWORD(wParam)是发送消息的控件或菜单的ID，lParam是发送消息的控件的HWND(窗口句柄)，如果这个值为NULL，表示这个消息不是由控件发送的。<br /><br />HIWORD()和LOWORD()是Windows定义的宏，分别取出一个32位整型值的高字和低字。在Win32中，一个&#8221;字&#8221;是一个16位整型，DWORD(Double WORD)是32位整型。<br /><br />可以用PostMessage()或SendMessage()发送消息。PostMessage()把一个消息放入消息队列(Message Queue)后立即返回，也就是当调用PostMessage()，函数执行完成返回时，很可能消息尚未处理。SendMessage()直接将消息发送到窗口，直到这个消息处理完成才返回。如果要关闭一个窗口，可以给它发送一个WM_CLOSE消息，像PostMessage(hwnd, WM_CLOSE, 0, 0); 效果跟点击窗口右上角的<img alt="" align="absMiddle" src="http://www.xianfen.net/Upload/img_big/2009062710475472.jpg" width="49" height="24" />(关闭)按钮是一样的。注意这里的wParam和lParam的值都是0，因为前面提到过，WM_CLOSE消息会忽略上述两个参数。<br /><br /><strong><span style="font-size: small">对话框(Dialogs)<br /></span></strong><br />如果使用对话框，为跟控件通信，你需要向控件发送消息。你或者可以使用GetDlgItem()函数根据控件的ID取得控件的句柄，然后调用SendMessage()函数发送消息；或者使用SendDlgItemMessage()组合了上面的步骤。传入一个窗口句柄和子控件的ID能够取得子控件的句柄，用这个句柄发送消息。跟SendDlgItemMessage()类似的API如GetDlgItemText()能够对所有的窗口进行操作，而不仅仅是对话框。<br /><br /><span style="font-size: small"><strong>什么是消息队列(Message Queue)</strong></span><br /><br />假设一个场景：系统正在处理WM_PAINT消息，就在这时用户在键盘上敲击了一些按键，这时会发生什么呢？系统应该中断绘图操作然后处理按键消息还是应该丢弃按键的消息？很明显这些都是不合理的，因此我们引入了消息队列，当消息发送过来，将消息加入消息队列，当一个消息被处理时，将其从消息队列移除。这样确保消息不会丢失，当你正在处理一个消息时，其它到来的消息可以加入到消息队列直到被处理。<br /><br /><strong><span style="font-size: small">什么是消息循环(Message Loop)</span></strong><br /><br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">while</span><span style="color: #000000">(GetMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg, NULL, </span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000">) </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">) <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg); <br />&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg); <br />} <br /></span></div><br />上面代码的执行过程为：<br />1. 消息循环调用GetMessage()从消息队列中查找消息进行处理，如果消息队列为空，程序将停止执行并等待(程序阻塞)。<br />2. 事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件)，GetMessage()将返回一个正值，这表明有消息需要被处理，并且消息已经填充到传入的MSG参数中；当传入WM_QUIT消息时返回0；如果返回值为负表明发生了错误。<br />3. 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数，这个函数做一些额外的处理：将虚拟键值信息转换为字符信息。这一步实际上是可选的，但有些地方需要用到这一步。<br />4. 上面的步骤执行完后，将消息传递给DispatchMessage()函数。DispatchMessage()函数将消息分发到消息的目标窗口，并且查找目标窗口过程函数，给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。<br />5. 在窗口过程函数中，检查消息和其他参数，你可以用它来实现你想要的操作。如果不想处理某些特殊的消息，你应该总是调用DefWindowProc()函数，系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。<br />6. 一旦一个消息处理完成，窗口过程函数返回，DispatchMessage()函数返回，继续循环处理下一个消息。<br /><br />消息循环对Windows编程来说是一个非常重要的概念。窗口过程函数并不是系统自动调用的，而是由开发人员自己通过调用DispatchMessage()间接的调用的。如果你愿意，可以调用GetWindowLong()函数通过窗口句柄查找到窗口过程函数直接调用达到消息处理的目的。<br /><br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">while</span><span style="color: #000000">(GetMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg, NULL, </span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000">) </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">) <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;WNDPROC fWndProc </span><span style="color: #000000">=</span><span style="color: #000000"> (WNDPROC)GetWindowLong(Msg.hwnd, GWL_WNDPROC); <br />&nbsp;&nbsp;&nbsp;&nbsp;fWndProc(Msg.hwnd, Msg.message, Msg.wParam, Msg.lParam); <br />} <br /></span></div>我尝试着写了上面的代码，它确实能工作，但这里存在各种问题，像Unicode/ANSI编码转换、定时器回调等等都这样的代码都不适合，并且很可能导致很多打断很多程序的正常运行。因此这样的代码在这里仅仅是试验，真实项目中一定不能编写这样的代码。<br /><br />注意这里我们用GetWindowLong()来获得相关窗口的窗口过程函数。为什么我们不直接调用WndProc()函数呢？消息循环会处理程序中所有窗口的消息，包括像按钮、列表框等有他们自己的窗口过程函数的控件，因此我们要保证调用正确的窗口过程函数。尽管有时几个窗口调用同一个窗口过程函数，但函数的第一个参数 (窗口的句柄) 通常用于告知窗口过程函数是那个窗口发送的消息。<br /><br />代码可以看出，程序的大部分时间都在处理消息循环。窗口会不断的处理发过来的消息，但如果要退出程序该怎么做呢？因为我们用的是while()循环，如果GetMessage()返回的是FALSE(即0)会退出循环，程序能够执行到WinMain()结束处，即程序退出：这正是PostQuitMessage()函数完成的工作，该函数会将WM_QUIT消息添加到消息队列的队尾，GetMessage()从消息队列取出WM_QUIT消息，填充Msg结构，返回的不是正数，而是0。与此同时，结构Msg的成员wParam的值会被置为你传给PostQuitMessage()函数参数的值，你可以选择忽略它或做为WinMain()函数的返回值即进程的退出代码(Exit Code)。<br /><br />注意：如果发生错误，GetMessage()函数将返回-1。你应该记住这点，说不定你的程序会因此出错。尽管GetMessage()返回值位BOOL型，但它可以返回TRUE或FALSE之外的值，因为BOOL被定义成UINT(unsigned int)。下面的程序貌似能正常工作，但有些时候不能正常工作。<br /><br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">while</span><span style="color: #000000">(GetMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg, NULL, </span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000">)) <br /><br /></span><span style="color: #0000ff">while</span><span style="color: #000000">(GetMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg, NULL, </span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000">) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">) <br /><br /></span><span style="color: #0000ff">while</span><span style="color: #000000">(GetMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg, NULL, </span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000">) </span><span style="color: #000000">==</span><span style="color: #000000"> TRUE)</span></div><br />上面的代码都是错误的！有些程序中你会看到会使用第一中方式，使用这种方式你必须保证GetMessage()总是执行成功，否则应该使用下面这段代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">while</span><span style="color: #000000">(GetMessage(</span><span style="color: #000000">&amp;</span><span style="color: #000000">Msg, NULL, </span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000">) </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">)</span></div><br />希望你对Windows消息循环能有很好的理解，如果还没有，慢慢来，在使用过程中会逐渐理解的。<br /><br />英文原文：<a href="http://winprog.org/tutorial/message_loop.html" target="_blank">http://winprog.org/tutorial/message_loop.html</a><br /><br />译注：感觉这篇文章对消息循环讲述的不错。如果有翻译的疏漏之处请指出。 <img src="http://www.cnblogs.com/zxjay/aggbug/1512372.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/zxjay/archive/2009/06/27/1512372.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/06/27/1512372.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>WPF BitmapImage与byte[]的转换</title><link>http://www.cnblogs.com/zxjay/archive/2009/06/25/1511183.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Thu, 25 Jun 2009 11:16:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/06/25/1511183.html</guid><description><![CDATA[<p>阅读: 347 评论: 3 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-06-25 19:16 <a href="http://www.cnblogs.com/zxjay/archive/2009/06/25/1511183.html" target="_blank">原文链接</a></p>有时要实现BitmapImage与byte[]相互转换，这里实现两个静态方法，直接调用即可。<br /><br />byte[]转换为BitmapImage：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> BitmapImage ByteArrayToBitmapImage(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[] byteArray) <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;BitmapImage bmp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BitmapImage(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.BeginInit(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.StreamSource </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> MemoryStream(byteArray); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp.EndInit(); <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> bmp; <br />}</span></div><br />BitmapImage转换为byte[]：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">byte</span><span style="color: #000000">[] BitmapImageToByteArray(BitmapImage bmp) <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[] byteArray </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream sMarket </span><span style="color: #000000">=</span><span style="color: #000000"> bmp.StreamSource; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (sMarket </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000"> sMarket.Length </span><span style="color: #000000">&gt;</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">很重要，因为Position经常位于Stream的末尾，导致下面读取到的长度为0。</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sMarket.Position </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">using</span><span style="color: #000000"> (BinaryReader br </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BinaryReader(sMarket)) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteArray </span><span style="color: #000000">=</span><span style="color: #000000"> br.ReadBytes((</span><span style="color: #0000ff">int</span><span style="color: #000000">)sMarket.Length); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">other exception handling</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> byteArray; <br />}</span></div><img src="http://www.cnblogs.com/zxjay/aggbug/1511183.html?type=1" width="1" height="1" alt=""/><p>评论: 3　<a href="http://www.cnblogs.com/zxjay/archive/2009/06/25/1511183.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/06/25/1511183.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>VC++中启用XP主题外观</title><link>http://www.cnblogs.com/zxjay/archive/2009/06/17/1505255.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Wed, 17 Jun 2009 10:32:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/06/17/1505255.html</guid><description><![CDATA[<p>阅读: 186 评论: 0 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-06-17 18:32 <a href="http://www.cnblogs.com/zxjay/archive/2009/06/17/1505255.html" target="_blank">原文链接</a></p>.NET Winform中，启用XP主题外观执行以下语句即可：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #000000">Application.EnableVisualStyles();</span></div><br />VC Win32项目，默认是不启用XP主题外观的，并不是每个人都喜欢简洁的Windows经典主题外观。<br />启用XP主题外观，需要用资源文件。有种更简单的方式：<br />头文件里加入以下语句：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #000000">#include </span><span style="color: #000000">&lt;</span><span style="color: #000000">CommCtrl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"> <br /></span><span style="color: #0000ff">#pragma</span><span style="color: #000000"> comment(lib, "ComCtl32.Lib")</span><span style="color: #000000"> <br /></span><span style="color: #0000ff">#pragma</span><span style="color: #000000"> comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")</span><span style="color: #000000"> <br /></span></div><br />在main函数最前面调用InitCommonControls函数：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">int</span><span style="color: #000000"> APIENTRY _tWinMain(HINSTANCE hInstance, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPTSTR&nbsp;&nbsp;&nbsp;&nbsp;lpCmdLine, <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">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nCmdShow) <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;InitCommonControls(); <br />&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, L</span><span style="color: #800000">"</span><span style="color: #800000">Windows XP theme was enabled.</span><span style="color: #800000">"</span><span style="color: #000000">, L</span><span style="color: #800000">"</span><span style="color: #800000">http://www.xianfen.net</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #800080">0</span><span style="color: #000000"> ); <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">; <br />}</span></div><br />运行程序已经启用了XP主题外观，如图：<br /><img alt="" src="http://www.xianfen.net/Upload/img_big/2009061718314625.jpg" width="218" height="103" /><br /> <img src="http://www.cnblogs.com/zxjay/aggbug/1505255.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/zxjay/archive/2009/06/17/1505255.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/06/17/1505255.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>C#4.0初探：dynamic 关键字</title><link>http://www.cnblogs.com/zxjay/archive/2009/05/29/Xianfen_Net_CS4_dynamic.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Thu, 28 May 2009 17:54:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/05/29/Xianfen_Net_CS4_dynamic.html</guid><description><![CDATA[<p>阅读: 1957 评论: 9 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-05-29 01:54 <a href="http://www.cnblogs.com/zxjay/archive/2009/05/29/Xianfen_Net_CS4_dynamic.html" target="_blank">原文链接</a></p>C#新增了dynamic关键字，正因为这一个小小的关键字，C#动态特性向前迈进了一大步。<br />dynamic是一个类型关键字，声明为dynamic的类型与"静态类型"（这里的静态类型是指编译时确定的类型，下同）相比最大的特点它是"动态类型"，它会运行时尝试调用方法，这些方法的存在与否不是在编译时检查的，而是在运行时查找，如果方法存在并且参数正确，会正常调用，否则会抛出Microsoft.CSharp.RuntimeBinder.RuntimeBinderException异常。<br /><br />看一个最简单的示例：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">using</span><span style="color: #000000"> System; <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.TestDynamic <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic d </span><span style="color: #000000">=</span><span style="color: #000000"> Console.Out; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic a; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Int32(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000"> b </span><span style="color: #000000">=</span><span style="color: #000000"> a; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="color: #000000">++</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="color: #000000">--</span><span style="color: #000000">; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">http://www.xianfen.net/</span><span style="color: #800000">"</span><span style="color: #000000">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.WriteLine(d.GetType()); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.writeln(</span><span style="color: #800000">"</span><span style="color: #800000">test</span><span style="color: #800000">"</span><span style="color: #000000">); </span><span style="color: #008000">//</span><span style="color: #008000">抛出Microsoft.CSharp.RuntimeBinder.RuntimeBinderException异常</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />对dynamic类型的操作只能有以下几种：<br />&#183;赋值<br />&#183;方法调用<br />&#183;自增<br />&#183;自减<br />&#183;接受"静态类型"的构造器创建的对象<br /><br /><span style="font-size: small"><span style="color: #800000"><strong>与关键字var的比较</strong></span></span><br />从表面上看，dynamic与var关键字的用法很像，但实质上有本质区别。<br />var关键字被称为：隐含类型局部变量(Local Variable Type Inference)，var只能用作局部变量，不能用于字段、参数等；声明的同时必须初始化；初始化时类型就已经明确了，并且不能再被赋值不能进行隐式类型转换的类型的数据；编译时编译器会对var定义的变量进行类型推断，这时变量的类型已经被确定。<br />dynamic可用于类型的字段，方法参数，方法返回值，可用于泛型的类型参数等；可以赋值给或被赋值任何类型并且不需显式的强制类型转换，因为这些是运行时执行的，这要得益于dynamic类型的动态特性。<br /><br /><strong><span style="color: #800000"><span style="font-size: small">与反射的比较</span></span></strong><br />首先能看到的是，dynamic与反射相比，执行相同操作所需的代码少的多。<br />如调用类Me中的GetName()方法。<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">class</span><span style="color: #000000"> Me <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000"> Blog { </span><span style="color: #0000ff">get</span><span style="color: #000000">; </span><span style="color: #0000ff">set</span><span style="color: #000000">; } <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000"> GetName() <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #800000">"</span><span style="color: #800000">Zhenxing Zhou</span><span style="color: #800000">"</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />用反射调用GetName()方法：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #000000">Assembly a </span><span style="color: #000000">=</span><span style="color: #000000"> Assembly.GetExecutingAssembly(); <br /></span><span style="color: #0000ff">object</span><span style="color: #000000"> instance </span><span style="color: #000000">=</span><span style="color: #000000"> a.CreateInstance(</span><span style="color: #800000">"</span><span style="color: #800000">Xianfen.Net.TestDynamic.Me</span><span style="color: #800000">"</span><span style="color: #000000">); <br />Type type </span><span style="color: #000000">=</span><span style="color: #000000"> instance.GetType(); <br />MethodInfo mi </span><span style="color: #000000">=</span><span style="color: #000000"> type.GetMethod(</span><span style="color: #800000">"</span><span style="color: #800000">GetName</span><span style="color: #800000">"</span><span style="color: #000000">); <br /></span><span style="color: #0000ff">object</span><span style="color: #000000"> result </span><span style="color: #000000">=</span><span style="color: #000000"> mi.Invoke(instance, </span><span style="color: #0000ff">null</span><span style="color: #000000">);</span></div><br />同样的dynamic调用：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #000000">dynamic myInfo </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Me(); <br /></span><span style="color: #0000ff">string</span><span style="color: #000000"> result </span><span style="color: #000000">=</span><span style="color: #000000"> myInfo.GetName();</span></div><br />dynamic类型与反射相比能进行的操作要少的多。<br />目前dynamic类型对属性调用是不可用的，但我们知道，属性生成IL时，对属性的读或写会生成对应的在属性名前加上get_或set_前缀生成相应的方法，尝试调用两个方法来访问属性：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #000000">dynamic myInfo </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Me(); <br />myInfo.set_Blog(</span><span style="color: #800000">"</span><span style="color: #800000">http://www.xianfen.net/</span><span style="color: #800000">"</span><span style="color: #000000">); <br /></span><span style="color: #0000ff">string</span><span style="color: #000000"> result </span><span style="color: #000000">=</span><span style="color: #000000"> myInfo.get_Blog();</span></div><br />会抛出异常，提示找不到get/set_Blog方法。这点比较遗憾，同样，对有参属性的访问也是不行的。<br />反射还可以访问私有方法字段以及其它类型成员及取得类型及类型成员的信息等。<br /><br /><span style="color: #800000"><strong><span style="font-size: small">dynamic类型的效率</span></strong></span><br />效率问题应该是大家很关心的，我的感觉：不要对动态语言有很高的效率抱有太大的希望，但另一方面，算法的设计对效率的影响非常大，功能与性能经常存在一个平衡点。<br />要分析其效率，就要看看编译后内部都干了些啥，方法是写些简单的代码，查看IL。<br />代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">using</span><span style="color: #000000"> System; <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.TestDynamic <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800000">"</span><span style="color: #800000">str</span><span style="color: #800000">"</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.ToString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />对应的IL代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">.class</span><span style="color: #000000"> </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">auto</span><span style="color: #000000"> </span><span style="color: #0000ff">ansi</span><span style="color: #000000"> </span><span style="color: #0000ff">beforefieldinit</span><span style="color: #000000"> Program <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000"> [mscorlib]System.Object <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.method</span><span style="color: #000000"> </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">hidebysig</span><span style="color: #000000"> </span><span style="color: #0000ff">specialname</span><span style="color: #000000"> </span><span style="color: #0000ff">rtspecialname</span><span style="color: #000000"> </span><span style="color: #0000ff">instance</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> .ctor() </span><span style="color: #0000ff">cil</span><span style="color: #000000"> </span><span style="color: #0000ff">managed</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.maxstack</span><span style="color: #000000"> </span><span style="color: #800080">8</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0000:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldarg.0</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0001:</span><span style="color: #000000"> </span><span style="color: #0000ff">call</span><span style="color: #000000"> </span><span style="color: #0000ff">instance</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> [mscorlib]System.Object::.ctor() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0006:</span><span style="color: #000000"> </span><span style="color: #0000ff">ret</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.method</span><span style="color: #000000"> </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">hidebysig</span><span style="color: #000000"> static </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() </span><span style="color: #0000ff">cil</span><span style="color: #000000"> </span><span style="color: #0000ff">managed</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.entrypoint</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.maxstack</span><span style="color: #000000"> </span><span style="color: #800080">9</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.locals</span><span style="color: #000000"> </span><span style="color: #0000ff">init</span><span style="color: #000000"> ( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #800080">0</span><span style="color: #000000">] </span><span style="color: #0000ff">object</span><span style="color: #000000"> d, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[</span><span style="color: #800080">1</span><span style="color: #000000">] </span><span style="color: #0000ff">class</span><span style="color: #000000"> [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo[] CS$</span><span style="color: #800080">0</span><span style="color: #000000">$</span><span style="color: #800080">0000</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0000:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldstr</span><span style="color: #000000"> </span><span style="color: #800000">"</span><span style="color: #800000">str</span><span style="color: #800000">"</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0005:</span><span style="color: #000000"> </span><span style="color: #0000ff">stloc.0</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0006:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldsfld</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt; Xianfen.Net.TestDynamic.Program/&lt;Main&gt;o__SiteContainer0::&lt;&gt;p__Site1 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_000b:</span><span style="color: #000000"> </span><span style="color: #0000ff">brtrue.s</span><span style="color: #000000"> L_003f <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_000d:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldc.i4.0</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_000e:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldstr</span><span style="color: #000000"> </span><span style="color: #800000">"</span><span style="color: #800000">ToString</span><span style="color: #800000">"</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0013:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldtoken</span><span style="color: #000000"> Xianfen.Net.TestDynamic.Program <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0018:</span><span style="color: #000000"> </span><span style="color: #0000ff">call</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_001d:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldnull</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_001e:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldc.i4.1</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_001f:</span><span style="color: #000000"> </span><span style="color: #0000ff">newarr</span><span style="color: #000000"> [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0024:</span><span style="color: #000000"> </span><span style="color: #0000ff">stloc.1</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0025:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldloc.1</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0026:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldc.i4.0</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0027:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldc.i4.0</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0028:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldnull</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0029:</span><span style="color: #000000"> </span><span style="color: #0000ff">newobj</span><span style="color: #000000"> </span><span style="color: #0000ff">instance</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags, </span><span style="color: #0000ff">string</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_002e:</span><span style="color: #000000"> </span><span style="color: #0000ff">stelem.ref</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_002f:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldloc.1</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0030:</span><span style="color: #000000"> </span><span style="color: #0000ff">newobj</span><span style="color: #000000"> </span><span style="color: #0000ff">instance</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder::.ctor(valuetype [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpCallFlags, </span><span style="color: #0000ff">string</span><span style="color: #000000">, </span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Type, </span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Collections.Generic.IEnumerable`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Type&gt;, </span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Collections.Generic.IEnumerable`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [Microsoft.CSharp]Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo&gt;) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0035:</span><span style="color: #000000"> </span><span style="color: #0000ff">call</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;!</span><span style="color: #800080">0</span><span style="color: #000000">&gt; [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;::Create(</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSiteBinder) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_003a:</span><span style="color: #000000"> </span><span style="color: #0000ff">stsfld</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt; Xianfen.Net.TestDynamic.Program/&lt;Main&gt;o__SiteContainer0::&lt;&gt;p__Site1 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_003f:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldsfld</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt; Xianfen.Net.TestDynamic.Program/&lt;Main&gt;o__SiteContainer0::&lt;&gt;p__Site1 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0044:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldfld</span><span style="color: #000000"> !</span><span style="color: #800080">0</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;::Target <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0049:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldsfld</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt; Xianfen.Net.TestDynamic.Program/&lt;Main&gt;o__SiteContainer0::&lt;&gt;p__Site1 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_004e:</span><span style="color: #000000"> </span><span style="color: #0000ff">ldloc.0</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_004f:</span><span style="color: #000000"> </span><span style="color: #0000ff">callvirt</span><span style="color: #000000"> </span><span style="color: #0000ff">instance</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;::Invoke(!</span><span style="color: #800080">0</span><span style="color: #000000">, !</span><span style="color: #800080">1</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">L_0054:</span><span style="color: #000000"> </span><span style="color: #0000ff">ret</span><span style="color: #000000"> <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.class</span><span style="color: #000000"> abstract </span><span style="color: #0000ff">auto</span><span style="color: #000000"> </span><span style="color: #0000ff">ansi</span><span style="color: #000000"> sealed </span><span style="color: #0000ff">nested</span><span style="color: #000000"> </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">beforefieldinit</span><span style="color: #000000"> &lt;Main&gt;o__SiteContainer0 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000"> [mscorlib]System.Object <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.custom</span><span style="color: #000000"> </span><span style="color: #0000ff">instance</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.field</span><span style="color: #000000"> </span><span style="color: #0000ff">public</span><span style="color: #000000"> static </span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite`</span><span style="color: #800080">1</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [mscorlib]System.Action`</span><span style="color: #800080">2</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000"> [System.Core]System.Runtime.CompilerServices.CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt; &lt;&gt;p__Site1 <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />可以看出生成的IL代码确实不美观，不过大体能看出端倪。为了方便查看，用Reflector查看，把反编译结果设置为.net2.0，代码清晰多了：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #800080">01</span><span style="color: #000000">. </span><span style="color: #0000ff">internal</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br /></span><span style="color: #800080">02</span><span style="color: #000000">. { <br /></span><span style="color: #800080">03</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> Methods</span><span style="color: #008000"> <br /></span><span style="color: #800080">04</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br /></span><span style="color: #800080">05</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: #800080">06</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">object</span><span style="color: #000000"> d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800000">"</span><span style="color: #800000">str</span><span style="color: #800000">"</span><span style="color: #000000">; <br /></span><span style="color: #800080">07</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) <br /></span><span style="color: #800080">08</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: #800080">09</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">=</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">. <br /></span><span style="color: #800080">10</span><span style="color: #000000">. Create(</span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpInvokeMemberBinder(CSharpCallFlags.None, </span><span style="color: #800000">"</span><span style="color: #800000">ToString</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Program), <br /></span><span style="color: #800080">11</span><span style="color: #000000">. </span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo[] { </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo(CSharpArgumentInfoFlags.None, </span><span style="color: #0000ff">null</span><span style="color: #000000">) })); <br /></span><span style="color: #800080">12</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: #800080">13</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1.Target(</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1, d); <br /></span><span style="color: #800080">14</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: #800080">15</span><span style="color: #000000">. </span><span style="color: #008000">//</span><span style="color: #008000"> Nested Types</span><span style="color: #008000"> <br /></span><span style="color: #800080">16</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; [CompilerGenerated] <br /></span><span style="color: #800080">17</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0 <br /></span><span style="color: #800080">18</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: #800080">19</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000">//</span><span style="color: #008000"> Fields</span><span style="color: #008000"> <br /></span><span style="color: #800080">20</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1; <br /></span><span style="color: #800080">21</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: #800080">22</span><span style="color: #000000">. }</span></div><br />06行先把赋值给dynamic的值赋给object类型，检查编译器生成的静态类&lt;Main&gt;o__SiteContainer0的静态字段&lt;&gt;p__Site1是否为null，如果是，则对其赋值，赋值的内容在这里不详细研究。然后调用&lt;&gt;p__Site1进行操作。<br />这里会发现两个问题：赋值给dynamic的值赋给object类型，对于值类型会不会执行同样的操作，会执行装箱操作吗；编译器生成的静态类&lt;Main&gt;o__SiteContainer0的静态字段&lt;&gt;p__Site1应该是缓存作用。这两个问题稍后验证。<br /><br /><strong>1)对值类型进行的操作</strong><br />如下代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">using</span><span style="color: #000000"> System; <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.TestDynamic <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">5</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.ToString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />反编译代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">internal</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Methods</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000"> d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">5</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">=</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">. <br />Create(</span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpInvokeMemberBinder(CSharpCallFlags.None, </span><span style="color: #800000">"</span><span style="color: #800000">ToString</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Program), <br /></span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo[] { </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo(CSharpArgumentInfoFlags.None, </span><span style="color: #0000ff">null</span><span style="color: #000000">) })); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1.Target(</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1, d); <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Nested Types</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[CompilerGenerated] <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0 <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Fields</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />可见确实对值类型进行了装箱操作，效率可想而知。<br /><br /><strong>2)编译器生成的缓存类<br /></strong>代码如下：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">using</span><span style="color: #000000"> System; <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.TestDynamic <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">5</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.ToString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.ToString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />反编译的代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">internal</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Methods</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000"> d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">5</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">=</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">.Create(</span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpInvokeMemberBinder(CSharpCallFlags.None, </span><span style="color: #800000">"</span><span style="color: #800000">ToString</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Program), </span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo[] { </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo(CSharpArgumentInfoFlags.None, </span><span style="color: #0000ff">null</span><span style="color: #000000">) })); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1.Target(</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1, d); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site2 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site2 </span><span style="color: #000000">=</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">.Create(</span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpInvokeMemberBinder(CSharpCallFlags.None, </span><span style="color: #800000">"</span><span style="color: #800000">ToString</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Program), </span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo[] { </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo(CSharpArgumentInfoFlags.None, </span><span style="color: #0000ff">null</span><span style="color: #000000">) })); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site2.Target(</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site2, d); <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Nested Types</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[CompilerGenerated] <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0 <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Fields</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site2; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />代码调用了ToString方法，但编译器生成了两份缓存。<br /><br />如果是在循环中：<br />代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">using</span><span style="color: #000000"> System; <br /><br /></span><span style="color: #0000ff">namespace</span><span style="color: #000000"> <a href="http://www.xianfen.net/" target="_blank">Xianfen</a>.Net.TestDynamic <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">5</span><span style="color: #000000">; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #800080">100</span><span style="color: #000000">; i</span><span style="color: #000000">++</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.ToString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />反编译代码：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px;background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">internal</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Program <br />{ <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Methods</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Main() <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000"> d </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">5</span><span style="color: #000000">; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> </span><span style="color: #800080">100</span><span style="color: #000000">; i</span><span style="color: #000000">++</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&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">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1 </span><span style="color: #000000">=</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">.Create(</span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpInvokeMemberBinder(CSharpCallFlags.None, </span><span style="color: #800000">"</span><span style="color: #800000">ToString</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">typeof</span><span style="color: #000000">(Program), </span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo[] { </span><span style="color: #0000ff">new</span><span style="color: #000000"> CSharpArgumentInfo(CSharpArgumentInfoFlags.None, </span><span style="color: #0000ff">null</span><span style="color: #000000">) })); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1.Target(</span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0.</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1, d); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Nested Types</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[CompilerGenerated] <br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> </span><span style="color: #000000">&lt;</span><span style="color: #000000">Main</span><span style="color: #000000">&gt;</span><span style="color: #000000">o__SiteContainer0 <br />&nbsp;&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> Fields</span><span style="color: #008000"> <br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> CallSite</span><span style="color: #000000">&lt;</span><span style="color: #000000">Action</span><span style="color: #000000">&lt;</span><span style="color: #000000">CallSite, </span><span style="color: #0000ff">object</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000"> </span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">p__Site1; <br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />}</span></div><br />可见在循环中，相同的操作做了一次缓存；但非循环环境下，调用一次会缓存一次，猜测原因是，重复调用一个方法的次数不会太多，并且很多情况准确查找起来比较困难。<br />(以上代码在VS2010Beta1下测试通过)<br />URL: <a href="http://www.xianfen.net/" target="_blank">http://www.xianfen.net/</a><br />Author: Zhenxing Zhou<br /><br /><img src="http://www.cnblogs.com/zxjay/aggbug/1491546.html?type=1" width="1" height="1" alt=""/><p>评论: 9　<a href="http://www.cnblogs.com/zxjay/archive/2009/05/29/Xianfen_Net_CS4_dynamic.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/05/29/Xianfen_Net_CS4_dynamic.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>四个字节整型转换为IP格式</title><link>http://www.cnblogs.com/zxjay/archive/2009/04/28/1444942.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Mon, 27 Apr 2009 16:00:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/04/28/1444942.html</guid><description><![CDATA[<p>阅读: 219 评论: 2 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-04-28 00:00 <a href="http://www.cnblogs.com/zxjay/archive/2009/04/28/1444942.html" target="_blank">原文链接</a></p>常规的四个字节整型转换为IP格式比较麻烦，用非托管的方式及一点小窍门，转换实现会变得非常的简单，代码如下：<br />
<div style="border-bottom: #ff9966 1px dashed; border-left: #ff9966 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px; background: #ffffdd; border-top: #ff9966 1px dashed; border-right: #ff9966 1px dashed; padding-top: 10px"><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">unsafe</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000"> ConvertIP(</span><span style="color: #0000ff">int</span><span style="color: #000000"> i) <br />
{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">*</span><span style="color: #000000"> b </span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #0000ff">byte</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">i; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(</span><span style="color: #800000">"</span><span style="color: #800000">{0}.{1}.{2}.{3}</span><span style="color: #800000">"</span><span style="color: #000000">, </span><span style="color: #000000">*</span><span style="color: #000000">b, </span><span style="color: #000000">*</span><span style="color: #000000">(b </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #800080">1</span><span style="color: #000000">), </span><span style="color: #000000">*</span><span style="color: #000000">(b </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #800080">2</span><span style="color: #000000">), </span><span style="color: #000000">*</span><span style="color: #000000">(b </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #800080">3</span><span style="color: #000000">)); <br />
} <br />
</span></div>
<br />
调用ConvertIP(723830963)，结果为：179.200.36.43<br />
<br />
原理：参数i保存在栈上，占连续的四个字节；byte占一个字节。让byte指针指向i的起始地址，则指针指向的连续的四个字节都是i的内存空间，取出每个字节的内容转换为十进制然后格式化为IP地址格式即可。 
<img src="http://www.cnblogs.com/zxjay/aggbug/1444942.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/zxjay/archive/2009/04/28/1444942.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/04/28/1444942.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>拯救开启桌面效果后白屏的openSUSE</title><link>http://www.cnblogs.com/zxjay/archive/2009/04/27/1444941.html</link><dc:creator>飘遥(Zhenxing Zhou)</dc:creator><author>飘遥(Zhenxing Zhou)</author><pubDate>Mon, 27 Apr 2009 15:59:00 GMT</pubDate><guid>http://www.cnblogs.com/zxjay/archive/2009/04/27/1444941.html</guid><description><![CDATA[<p>阅读: 194 评论: 0 作者: <a href="http://www.cnblogs.com/zxjay/" target="_blank">飘遥(Zhenxing Zhou)</a> 发表于 2009-04-27 23:59 <a href="http://www.cnblogs.com/zxjay/archive/2009/04/27/1444941.html" target="_blank">原文链接</a></p>我用的是openSUSE 11.1，桌面环境为GNOME,由于驱动没有安装完善，开启桌面效果后屏幕变成全白色，按Alt+Tab切换窗口能隐约看到窗口的边界，重启后刚进入登录界面就白屏了。<br />
进入白屏后，按Ctrl+Alt+F1，root身份登录，运行sax2，重新配置图形系统，重启后仍然白屏。<br />
最后一招：进入白屏后，按Ctrl+Alt+F1，root身份登录，cd到默认登录用户的目录，然后进入<br />
.config/compiz/，将该目录下的enable-compiz文件重命名，如：<br />
<div style="border-bottom: rgb(255,153,102) 1px dashed; border-left: rgb(255,153,102) 1px dashed; padding-bottom: 10px; line-height: 1.2em; padding-left: 10px; padding-right: 10px; background: rgb(255,255,221); border-top: rgb(255,153,102) 1px dashed; border-right: rgb(255,153,102) 1px dashed; padding-top: 10px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="color: rgb(0,0,0)">mv enable</span><span style="color: rgb(128,128,128)">-</span><span style="color: rgb(0,0,0)">compiz enable</span><span style="color: rgb(128,128,128)">-</span><span style="color: rgb(0,0,0)">compizbak</span></div>
重启X，重新找回了绿色的的可爱的桌面了。<br />
<img src="http://www.cnblogs.com/zxjay/aggbug/1444941.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/zxjay/archive/2009/04/27/1444941.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/zxjay/archive/2009/04/27/1444941.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56817/" target="_blank">京东商城刘强东：两个回合谈定1.5亿美元融资</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56816/" target="_blank">Google走到关键时刻：Buzz发布的背后</a><span style="color:gray">(2010-02-10 11:30)</span><br/>· <a href="http://news.cnblogs.com/n/56815/" target="_blank">李开复创新工场发展基金曝光 首单投移动互联</a><span style="color:gray">(2010-02-10 11:28)</span><br/>· <a href="http://news.cnblogs.com/n/56814/" target="_blank">Sun前CEO欲写自传 称经济危机是Sun被购主因</a><span style="color:gray">(2010-02-10 11:25)</span><br/>· <a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><span style="color:gray">(2010-02-10 11:15)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>