<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_随风飘扬</title><subtitle type="text">喜欢清茶，喜欢静静的生活。技术的道路上没有尽头，生活的道路上留下足迹</subtitle><id>http://feed.cnblogs.com/blog/u/27725/rss</id><updated>2011-11-10T01:09:02Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/27725/rss"/><entry><id>http://www.cnblogs.com/nicch/archive/2011/11/01/ssms_diagram_error_after_uninstall_vs11.html</id><title type="text">卸载VS2011 Developer Preview后Sql Server2008 R2建立数据库关系图报“找不到指定的模块”错误的解决</title><summary type="text">1.哇哦，遇到问题了。 话说上回我为了尝尝螃蟹的味道而装了 VS2011 Developer Preview，但是装完后立马卸载掉了，原因是这家伙的安装目录位置没用，我设置到D盘的但是装完后D盘的文件夹只有一百多M，而足足8G+的空间是在C盘上消耗的。可怜我的C盘本来只有8.XG，所以不得不卸载掉它。 卸载掉本身没啥问题，只是昨晚突然发现 Sql Server 2008 R2 Management Studio 突然不能新建数据库关系图了，一建立就会报“找不到指定的模块（MS Visual Database Tools）”的错误： 为了这个错误我甚至认真评估了重新配置数据库的可...</summary><published>2011-11-01T14:52:00Z</published><updated>2011-11-01T14:52:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/11/01/ssms_diagram_error_after_uninstall_vs11.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/11/01/ssms_diagram_error_after_uninstall_vs11.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1.哇哦，遇到问题了。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;话说上回我为了尝尝螃蟹的味道而装了 VS2011 Developer Preview，但是装完后立马卸载掉了，原因是这家伙的安装目录位置没用，我设置到D盘的但是装完后D盘的文件夹只有一百多M，而足足8G+的空间是在C盘上消耗的。可怜我的C盘本来只有8.XG，所以不得不卸载掉它。&lt;/p&gt;  &lt;p&gt;卸载掉本身没啥问题，只是昨晚突然发现 Sql Server 2008 R2 Management Studio 突然不能新建数据库关系图了，一建立就会报“找不到指定的模块（MS Visual Database Tools）”的错误：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201111/201111012252079850.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ssms_diagram_error_after_uninstall_vs11" border="0" alt="ssms_diagram_error_after_uninstall_vs11" src="http://images.cnblogs.com/cnblogs_com/nicch/201111/20111101225208590.jpg" width="625" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;为了这个错误我甚至认真评估了重新配置数据库的可能性。无奈这个R2的SQL2008打过SP1了，无论是修复还是重装都是很花时间的事情，所以不甘心，在Google上找了一圈。终于找到个&lt;a href="http://social.msdn.microsoft.com/Forums/en/sqltools/thread/6a159935-b454-4e95-9553-32a4b390adf1" target="_blank"&gt;类似的主题&lt;/a&gt;反应了这个问题。是位国际友人报告的，标题是“SQL Server 2008 R2 - &amp;quot;Specified Module cannot be Found. (MS Visual Database Tools)&amp;quot;”，其实是一样的错误（他的是英文版……）。可惜这个主题中表示同样遭遇这个问题的人虽然不少，但是他们终究没找到解决方案。&lt;/p&gt;  &lt;p&gt;根据他们的经验，下面的方法已经确认是无效的：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;重装 SQL2008 （我想包括了修复） &lt;/li&gt;    &lt;li&gt;重装 .net framework 3.5 &lt;/li&gt;    &lt;li&gt;重装VS2010和VS2010 SP1 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;他们并没有讨论出个所以然来。如果非说他们有进度的话，那就是其中的一个哥们儿选择了『重装系统』来一了百了……&lt;/p&gt;  &lt;p&gt;作为一个Win7正式发布后就没重装过系统的人来说，这样的解决方案确实有点儿……无法接受。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.还是自己解决吧。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;伟大的领袖毛主席说，『自己动手，丰衣足食』。&lt;/p&gt;  &lt;p&gt;具体查找原因的过程略……其实就是用Process Monitor观察创建关系图时的加载操作，看看哪些是失败的，说出来又是巴拉巴拉一堆流水账，不说也罢。最终找到的原因是：『&lt;strong&gt;找不到 msvcr11.dll&lt;/strong&gt; 』。&lt;/p&gt;  &lt;p&gt;明眼人一看就知道这是 VS2011 中的附带的VC运行时，但为什么卸载VS2011后SQL Server 2008R2 还需要它，这个问题也许只有微软能解释了。（说不定是VS2011更新了SQL2008 R2也使用的共享组件？）&lt;/p&gt;  &lt;p&gt;既然知道原因了，那就很简单了。在VS2011 Developer Preview的安装包中找到“packages\vcRuntimeMinimum_x86\vcRuntimeMinimum_x86.msi”安装一下就行了。64位系统说不定把“packages\vcRuntimeMinimum_amd64\vcRuntimeMinimum_amd64.msi”也装一下更好一点。这样说来，回想起来我卸载VS2011的时候是把附带的组件想当然地觉得也是不需要的所以给一并删除了。看来删除有风险删除需谨慎啊，有些东西真的不是你想删，想删就能删的。哎。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/2232286.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/11/01/ssms_diagram_error_after_uninstall_vs11.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/10/17/invalidcastexception_when_using_linq_cast.html</id><title type="text">LINQ中的强制类型转换Cast函数其实挺坑爹的</title><summary type="text">今天被LINQ的Cast函数坑了一次，不过细究之下其实还是学到了新东西的。其实强制类型转换大部分人都会天天接触，可是谁会知道这里面还有点小秘密呢？ 1.强制类型转换？ 我想能看到这里的同学应该都不需要我去解释，所谓强制类型转换就是指将一个变量由一个数据类型强制转换为另一个类型，当然前提是对象和目标类型是兼容的。 下面这两行便执行了一个强制类型转换： double a = 23.0; int b = (int)a; 由于过于简单，这里说太多就有失水准鸟。 不过呢，这里要求俩类型具有兼容性；所谓的兼容性就是说要么它们是派生类的关系，要么系统知道如何去转换他们...</summary><published>2011-10-17T15:13:00Z</published><updated>2011-10-17T15:13:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/10/17/invalidcastexception_when_using_linq_cast.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/10/17/invalidcastexception_when_using_linq_cast.html"/><content type="html">&lt;p&gt;今天被LINQ的Cast函数坑了一次，不过细究之下其实还是学到了新东西的。其实强制类型转换大部分人都会天天接触，可是谁会知道这里面还有点小秘密呢？ &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.强制类型转换？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;我想能看到这里的同学应该都不需要我去解释，所谓强制类型转换就是指将一个变量由一个数据类型强制转换为另一个类型，当然前提是对象和目标类型是兼容的。   &lt;br /&gt;下面这两行便执行了一个强制类型转换： &lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;double&lt;/span&gt; a = 23.0; &lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt; b = (&lt;span style="color: blue"&gt;int&lt;/span&gt;)a; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;由于过于简单，这里说太多就有失水准鸟。    &lt;br /&gt;不过呢，这里要求俩类型具有兼容性；所谓的兼容性就是说要么它们是派生类的关系，要么系统知道如何去转换他们。     &lt;br /&gt;因此，对于自定义类型，我们往往会通过实现隐式转换或显示运算符来让它们支持转换，像下面的这个A和B类，这么搞一下俩人便能良好地兼容鸟： &lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;implicit&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;operator&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;B&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;A&lt;/span&gt; a) { &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;B&lt;/span&gt;(); } &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;implicit&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;operator&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;B&lt;/span&gt; a) { &lt;span style="color: blue"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;(); } &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;B&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Test() &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//直接强制乱转，木有问题&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; a = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;(); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; b = (&lt;span style="color: #2b91af"&gt;B&lt;/span&gt;)a; &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;在这个全民皆LINQ的时代，CLR也为我们带来了一个类型转换的扩展方法：Cast。    &lt;br /&gt;先来看一下&lt;a href="http://msdn.microsoft.com/zh-cn/library/bb341406.aspx" target="_blank"&gt;MSDN中关于Cast方法的定义&lt;/a&gt;：将 IEnumerable 的元素转换为指定的类型。 如果元素无法强制转换为 TResult 类型，则此方法将引发异常。    &lt;br /&gt;说白了，就是说Cast可以将一个序列从一个类型转换为另一个类型的序列。于是我便想当然地认为，那这个Cast不就是执行了一个强制类型转换嘛。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.可是真的是完整的强制类型转换吗？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;我回过头再去看的时候才发现原来MSDN中的介绍真的不怎么详细，只说是转换。可是这个『转换』到底是个嘛儿啊，到底怎么样的转换啊。   &lt;br /&gt;咱用事实来说话。祭出ILSpy看看Cast这个函数是怎么定义的：&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #008000"&gt;// System.Linq.Enumerable&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;summary&lt;/span&gt;&amp;gt;&lt;/span&gt;Converts the elements of an &lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;see&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;cref&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;T:System.Collections.IEnumerable&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt; to the specified type.&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold"&gt;summary&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;returns&lt;/span&gt;&amp;gt;&lt;/span&gt;An &lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;see&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;cref&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;T:System.Collections.Generic.IEnumerable`1&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt; that contains each element of the source sequence converted to the specified type.&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold"&gt;returns&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;param&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;name&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;The &lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;see&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;cref&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;T:System.Collections.IEnumerable&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt; that contains the elements to be converted.&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold"&gt;param&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&lt;span style="color: #808080"&gt;&amp;lt;typeparam &lt;span style="font-weight: bold"&gt;name&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;TResult&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;The type to convert the elements of &lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;paramref&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;name&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt; to.&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;typeparam&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;exception&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;cref&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;T:System.ArgumentNullException&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&amp;#160; &lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;paramref&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;name&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt; is null.&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold"&gt;exception&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;#160;&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;exception&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;cref&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;T:System.InvalidCastException&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;An element in the sequence cannot be cast to type &lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;paramref&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;name&lt;/span&gt;&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #c0c0c0; font-weight: bold"&gt;&amp;quot;TResult&amp;quot;&lt;/span&gt;&amp;#160;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;.&lt;span style="color: #808080"&gt;&amp;lt;&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="font-weight: bold"&gt;exception&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0000ff; font-weight: bold"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: #a52a2a"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TResult&amp;gt; Cast&amp;lt;TResult&amp;gt;(&lt;span style="font-weight: bold"&gt;this&lt;/span&gt; IEnumerable source)    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IEnumerable&amp;lt;TResult&amp;gt; enumerable = source &lt;span style="color: #008b8b; font-weight: bold"&gt;as&lt;/span&gt; IEnumerable&amp;lt;TResult&amp;gt;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff; font-weight: bold"&gt;if&lt;/span&gt; (enumerable != &lt;span style="font-weight: bold"&gt;null&lt;/span&gt;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000080"&gt;return&lt;/span&gt; enumerable;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff; font-weight: bold"&gt;if&lt;/span&gt; (source == &lt;span style="font-weight: bold"&gt;null&lt;/span&gt;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-weight: bold"&gt;throw&lt;/span&gt; Error.&lt;span style="color: #191970; font-weight: bold"&gt;ArgumentNull&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;&amp;quot;source&amp;quot;&lt;/span&gt;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000080"&gt;return&lt;/span&gt; Enumerable.CastIterator&amp;lt;TResult&amp;gt;(source);    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;这个代码本身不复杂，分三段。一段就是看类型是不是可以直接转换过去，如果可以的话就直接返回；值得注意的是在.Net 4.0中 IEnumerable&amp;lt;T&amp;gt;接口是协变的，所以派生类的IEnumerable&amp;lt;T&amp;gt;可以直接转换到基类的IEnumerable&amp;lt;T&amp;gt;。如果返回的是null，那就说明转换失败了，就会由最后一个 CastIterator 返回一个 IEnumerable。   &lt;br /&gt;用ILSpy看CastIterator其实也很简单：&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #0000ff; font-weight: bold"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: #a52a2a"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TResult&amp;gt; CastIterator&amp;lt;TResult&amp;gt;(IEnumerable source)    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff; font-weight: bold"&gt;foreach&lt;/span&gt; (&lt;span style="color: #ff0000"&gt;object&lt;/span&gt; current &lt;span style="color: #0000ff; font-weight: bold"&gt;in&lt;/span&gt; source)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000080"&gt;yield&lt;/span&gt;&amp;#160;&lt;span style="color: #000080"&gt;return&lt;/span&gt; (TResult)current;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000080"&gt;yield&lt;/span&gt;&amp;#160;&lt;span style="color: #000080"&gt;break&lt;/span&gt;;    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;似乎就是一个强制类型转换嘛。&lt;/p&gt;  &lt;p&gt;那好吧，我们写下这样的代码：&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Test() &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; aa=&lt;span style="color: blue"&gt;new&lt;/span&gt; []{&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;()}; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; bb=aa.Cast&amp;lt;&lt;span style="color: #2b91af"&gt;B&lt;/span&gt;&amp;gt;().ToArray(); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;从第一节的例子我们能看到，A完全是可以强制类型转换为B的。可是出人意料的，这里会抛出一个InvalidCastException：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Unable to cast object of type 'A' to type 'B'.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201110/201110172312524605.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201110/201110172312547438.png" width="635" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;如果不是之前已经说过了能正常转换，我一定会觉得是自己的转换代码出了问题。事实上也确实如此，我下午在项目里转悠了一个小时找到底是哪里写错了。没理由强制类型转换却转换不了不是？&lt;/p&gt;  &lt;p&gt;好在到最后我终于把怀疑的目标指向了Cast函数本身。于是写下这段代码测试一下：&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Test() &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;double&lt;/span&gt;[] a = &lt;span style="color: blue"&gt;new&lt;/span&gt;[] { 12.4 }; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt;[] b = a.Cast&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;().ToArray(); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;果然这个Cast还是抛出了InvalidCastException异常：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201110/201110172312553926.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201110/201110172313011139.png" width="574" height="213" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这个Cast函数到底干的啥啊？啥都转不了啊这个？&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.那这下怎么办？&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Cast不能用，那直接用 Select 不就结了？这样就行了。&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Test() &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; aa = &lt;span style="color: blue"&gt;new&lt;/span&gt;[] { &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;() }; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; bb = aa.Select(s =&amp;gt; (&lt;span style="color: #2b91af"&gt;B&lt;/span&gt;)s).ToArray(); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;4.追根究底&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;可是我还是想知道上面看起来像是强制类型转换的那货为啥会抛异常？&lt;/p&gt;  &lt;p&gt;在MSDN和ILSpy中转悠了半天后，祭出Google大神，终于找到一篇有用的资料：&lt;a href="http://kenegozi.com/blog/2009/10/01/linq-cast-extension-method-and-invalidcastexception" target="_blank"&gt;Linq Cast extension method and InvalidCastException&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;这位遇到相同命运的作者遇到的问题和上面我从double到int的转换测试类似，不过他是从byte转换到int，理论上隐式转换都行。   &lt;br /&gt;值得注意的是这篇博客本身没有解释问题，真正有价值的是在它的回复中。翻译过来就是这样：&lt;/p&gt;  &lt;p&gt;&lt;font color="#c0504d"&gt;在C#中，(type)&amp;lt;表达式&amp;gt; 是一个基本的类型转换运算符。也就是说，当编译器知道一个表达式可以直接转换为另一个类型时，它会生成一个直接转换代码；如果不能，那么它会查找是否有自定义转换的方法，并生成调用它的代码。在直接面对类型的转换中，编译器知道哪些类别可以强制转换（虽然不能直接转换）。这时，因为byte不是int，所以不能直接转换，但是它可以通过正确的IL代码来转换为int（这里是 conv_i4操作码）。     &lt;br /&gt;然而，这样的操作只有当编译器在编译时知道表达式可以转换到目标类型才可以。当通过扩展方法的类型参数进行转换，编译器对TIn是否能直接转换或强制转换为TOut是一无所知的。正因为这些信息的缺失，我认为在Cast扩展方法中的IL代码是使用简单的&amp;quot;castclass&amp;quot;操作码，这个操作码并不具备在运行时查找显式转换方法的能力（或者它可以找，但是Cast运算符不进行那样的操作）。      &lt;br /&gt;这样便很简单了：因为byte不是int，所以Cast转换就会因为InvalidCastException失败，这和在这里描述的行为是完全一致的： &lt;span style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: 16px 微软雅黑; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" &gt;&lt;span style="color: rgb(34,34,34)" &gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.castclass%28VS.85%29.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.castclass%28VS.85%29.aspx&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;通过对这段话的解读，可以知道实际上(type)强制类型转换运算符涉及到编译时的操作。当通过类型参数进行转换时，因为编译器无法预知目标的类型信息，所以只能生成最基本的castclass操作代码，而无法对自定义转换函数等进行支持。这也就解释了为什么A和B实现了隐式运算符却会抛异常，而int和byte之间的Cast也会抛异常的问题。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5.再来验证下&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;依据上一节中的理解，那么我们可以认为下面这样一段代码是无法正常工作的：&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; TResult CastTest&amp;lt;TSource, TResult&amp;gt;(TSource s) &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; (TResult)s; &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Test() &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; b = CastTest&amp;lt;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;B&lt;/span&gt;&amp;gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;()); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;但当我们实际编译的时候，会惊奇地发现：何止不能工作，连编译都无法编译通过：&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;错误 1 无法将类型&amp;quot;TSource&amp;quot;转换为&amp;quot;TResult&amp;quot;&lt;/font&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;可是Cast方法的怎么编译成功的？再回头看了一下Cast的实现代码，才发现在foreach循环中先是将目标对象转换为了object，再实施强制类型转换的。由于object是万物的始祖，这么一来就搞得好像是和派生类之间的强制转换一样了。不得不说这真的是一个很曲线救国的方案。不管怎样，咱依葫芦画个瓢再说。&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;static&lt;/span&gt; TResult CastTest&amp;lt;TSource, TResult&amp;gt;(TSource s) &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; (TResult)((&lt;span style="color: blue"&gt;object&lt;/span&gt;)s); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Test() &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; b = CastTest&amp;lt;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;B&lt;/span&gt;&amp;gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;A&lt;/span&gt;()); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;结果这段代码抛出了一模一样的错误，很是光荣：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201110/201110172313046415.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201110/201110172313072181.png" width="684" height="166" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;查看下IL，用的是 unbox.any 操作码：&lt;/p&gt;  &lt;p&gt;&lt;span style="color: #008000; font-weight: bold"&gt;.method&lt;/span&gt;&amp;#160;&lt;span style="color: #0000ff; font-weight: bold"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color: #0000ff; font-weight: bold"&gt;hidebysig&lt;/span&gt;&amp;#160;&lt;span style="color: #0000ff; font-weight: bold"&gt;static&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; !!TResult CastTest&amp;lt;&lt;span style="color: #0000ff; font-weight: bold"&gt;class&lt;/span&gt; TSource, TResult&amp;gt; (    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; !!TSource s    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ) &lt;span style="color: #0000ff; font-weight: bold"&gt;cil&lt;/span&gt;&amp;#160;&lt;span style="color: #0000ff; font-weight: bold"&gt;managed&lt;/span&gt;&amp;#160; &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Method begins at RVA 0x29a4&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Code size 17 (0x11)&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000; font-weight: bold"&gt;.maxstack&lt;/span&gt; 1    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000; font-weight: bold"&gt;.locals&lt;/span&gt;&amp;#160;&lt;span style="color: #008000; font-weight: bold"&gt;init&lt;/span&gt; (    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [0] !!TResult CS$1$0000    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; )    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_0000: &lt;span style="color: #0000ff"&gt;nop&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_0001: &lt;span style="color: #0000ff"&gt;ldarg.0&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_0002: &lt;span style="color: #0000ff"&gt;box&lt;/span&gt; !!TSource    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_0007: &lt;span style="color: #0000ff"&gt;unbox&lt;/span&gt;.&lt;span style="color: #008000; font-weight: bold"&gt;any&lt;/span&gt; !!TResult    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_000c: &lt;span style="color: #0000ff"&gt;stloc.0&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_000d: &lt;span style="color: #0000ff"&gt;br.s&lt;/span&gt; IL_000f    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_000f: &lt;span style="color: #0000ff"&gt;ldloc.0&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; IL_0010: &lt;span style="color: #0000ff"&gt;ret&lt;/span&gt;    &lt;br /&gt;} &lt;span style="color: #008000"&gt;// end of method Test1::CastTest&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;根据&lt;a href="http://msdn.microsoft.com/library/system.reflection.emit.opcodes.unbox_any.aspx" target="_blank"&gt;MSDN中对 unbox_any 操作码的介绍&lt;/a&gt;，当目标值是个引用对象时，这个操作码的行为和 castclass 是一致的。可见上节中的解释，虽然不完全正确，但大致是不差的。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;6.总结&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;总结很简单：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cast扩展方法不具备调用自定义转换运算符的能力（包括隐式和显式的转换运算符） &lt;/li&gt;&lt;li&gt;但回头想想这样的设计也很合理，因为这是为了保持原有的序列的操作，如果真的类型转换了，那么序列就会被变更（虽然有时候这是故意的）；那这么说这个扩展函数的名称改为AsType是不是更加合适？&lt;/li&gt;&lt;li&gt;强制类型转换包括类型兼容性和自定义转换运算符。对自定义转换运算符需要编译器在编译时的参与，否则无法起作用 &lt;/li&gt;    &lt;li&gt;ILSpy显示的代码有时候仅供参考 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;PS，Live Writer有个毛病和VS2003的HTML设计器一样很讨厌，就是粘贴HTML代码的时候，它喜欢乱加font标签。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/2215960.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/10/17/invalidcastexception_when_using_linq_cast.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/07/19/bonobo_git_server_chs.html</id><title type="text">运行于IIS/MVC平台上的GIT服务器Bonobo Git Server的实践 (附带汉化补丁)</title><summary type="text">关于 Bonobo Git Server 之前曾经尝试在Windows平台上搭建一个GIT服务器，无奈又要装SSH又要这个又要那个的，便放在一边了，实在没工夫折腾它。昨天有点烦躁，于是便想折腾点儿什么...</summary><published>2011-07-19T04:31:00Z</published><updated>2011-07-19T04:31:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/07/19/bonobo_git_server_chs.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/07/19/bonobo_git_server_chs.html"/><content type="html">&lt;p&gt;&lt;strong&gt;关于 Bonobo Git Server&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;之前曾经尝试在Windows平台上搭建一个GIT服务器，无奈又要装SSH又要这个又要那个的，便放在一边了，实在没工夫折腾它。昨天有点烦躁，于是便想折腾点儿什么名堂，这不，就想起折腾它了。&lt;/p&gt;  &lt;p&gt;想起它的原因是，之前有看到&lt;a title="dudu的博客" href="http://dudu.cnblogs.com/" target="_blank"&gt;dudu&lt;/a&gt;的《&lt;a href="http://www.cnblogs.com/dudu/archive/2011/06/24/git_on_windows.html"&gt;用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器&lt;/a&gt;》，看的时候没有在意，这会儿想起来啦，便去下载了回来装上测试，安装其实挺简单，就是还是有点儿问题。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关于安装&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;安装的过程不用说的，因为 &lt;a title="dudu的博客" href="http://dudu.cnblogs.com/" target="_blank"&gt;dudu&lt;/a&gt; 说得足够明白了。值得一提的是WebDav必须打开，否则在Push的时候会出现“Return Code 22”的错误，其实服务器返回的是这样的一个错误：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201107/201107191230382822.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2011-7-19 10-33-57" border="0" alt="2011-7-19 10-33-57" src="http://images.cnblogs.com/cnblogs_com/nicch/201107/201107191230413638.png" width="875" height="395" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;嗯没错，PROPFIND这个方法需要WebDAV的支持，所以没打开的时候就会发生这个错误。&lt;/p&gt;  &lt;p&gt;当然，Return Code 22 也会有其它原因，后面再说。&lt;/p&gt;  &lt;p&gt;值得一提的是，我发现这个程序在IIS Express上也可以正常运行，可见IIS Express足够彪悍。设想一下如果设置Bonobo Git Server的库路径为相对路径，再带上IIS Express，这不就活脱脱一个移动源码库了么。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关于错误&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;似乎 &lt;a href="http://www.chodounsky.net/bonobo-git-server/" target="_blank"&gt;Bonobo Git Server&lt;/a&gt; 设置了“友好的错误信息”显示，因为它在 Global.asax.cs 中出现了如下的代码：&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;protected&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Application_Error(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e) &lt;/li&gt;    &lt;li&gt;{ &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Exception&lt;/span&gt; exception = Server.GetLastError(); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; Response.Clear(); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;HttpException&lt;/span&gt; httpException = exception &lt;span style="color: blue"&gt;as&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;HttpException&lt;/span&gt;; &lt;/li&gt;    &lt;li&gt;&lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;RouteData&lt;/span&gt; routeData = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;RouteData&lt;/span&gt;(); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; routeData.Values.Add(&lt;span style="color: #a31515"&gt;&amp;quot;controller&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (httpException == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; routeData.Values.Add(&lt;span style="color: #a31515"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (exception != &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Trace&lt;/span&gt;.TraceError(&lt;span style="color: #a31515"&gt;&amp;quot;Error occured and caught in Global.asax - {0}&amp;quot;&lt;/span&gt;, exception.ToString()); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;switch&lt;/span&gt; (httpException.GetHttpCode()) &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; 404: &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; routeData.Values.Add(&lt;span style="color: #a31515"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;PageNotFound&amp;quot;&lt;/span&gt;); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; 500: &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; routeData.Values.Add(&lt;span style="color: #a31515"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;ServerError&amp;quot;&lt;/span&gt;); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Trace&lt;/span&gt;.TraceError(&lt;span style="color: #a31515"&gt;&amp;quot;Server Error occured and caught in Global.asax - {0}&amp;quot;&lt;/span&gt;, exception.ToString()); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;default&lt;/span&gt;: &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; routeData.Values.Add(&lt;span style="color: #a31515"&gt;&amp;quot;action&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;Error&amp;quot;&lt;/span&gt;); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Trace&lt;/span&gt;.TraceError(&lt;span style="color: #a31515"&gt;&amp;quot;Error occured and caught in Global.asax - {0}&amp;quot;&lt;/span&gt;, exception.ToString()); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; Server.ClearError(); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; Response.TrySkipIisCustomErrors = &lt;span style="color: blue"&gt;true&lt;/span&gt;; &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IController&lt;/span&gt; errorController = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;HomeController&lt;/span&gt;(); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; errorController.Execute(&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;RequestContext&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;HttpContextWrapper&lt;/span&gt;(Context), routeData)); &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;简而言之，就是它在服务器处理请求出错的时候，尝试捕获错误的请求，记录日志后重写路由数据到自定义的错误。可惜这个方法并没有判断路径，所以当使用GIT客户端请求的时候它也一律返回HTML格式的错误页面。不过这并不是关键，而是记录下的错误大多是这样的：&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="910"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="908"&gt;         &lt;p&gt;w3wp.exe Error: 0 : Server Error occured and caught in Global.asax - System.Web.HttpException (0x80004005): Server cannot set status after HTTP headers have been sent.            &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.HttpResponse.set_StatusCode(Int32 value)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.HttpResponseWrapper.set_StatusCode(Int32 value)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.HttpStatusCodeResult.ExecuteResult(ControllerContext context)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.Controller.ExecuteCore()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.MvcHandler.&amp;lt;&amp;gt;c__DisplayClass6.&amp;lt;&amp;gt;c__DisplayClassb.&amp;lt;BeginProcessRequest&amp;gt;b__5()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.Async.AsyncResultWrapper.&amp;lt;&amp;gt;c__DisplayClass1.&amp;lt;MakeVoidDelegate&amp;gt;b__0()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.Async.AsyncResultWrapper.&amp;lt;&amp;gt;c__DisplayClass8`1.&amp;lt;BeginSynchronous&amp;gt;b__7(IAsyncResult _)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.MvcHandler.&amp;lt;&amp;gt;c__DisplayClasse.&amp;lt;EndProcessRequest&amp;gt;b__d()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.SecurityUtil.&amp;lt;GetCallInAppTrustThunk&amp;gt;b__0(Action f)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp;amp; completedSynchronously)&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;大家应该都看明白了，记录的这个错误根本就不是真正的错误。表面上看的这个错误信息是当响应标头已经发送后，不允许再修改状态码，但实际上是，因为发生了一个错误，导致错误被拦截，拦截之后尝试去更改状态码，可惜这时候又出错了 - -#&lt;/p&gt;  &lt;p&gt;所以关于GIT的操作一般一次出错会出现两个错误日志。一个是真正的错误，一个么就是这个 HttpException 了。但是个人感觉，对于开发人员而言，根本不需要什么友好的错误信息，友好的错误信息的存在只会干扰问题的解决。我昨儿遇到问题的时候，就因为这个破烂友好的错误信息的存在，在错误日志里面看到这个HttpException很奇怪，捣鼓了半天才发现这个不是关键，关键在其它地方。所以后来我将这个部分的代码全部取消了，改用Fiddler去抓取提交的请求，很顺利地解决了剩下的问题。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Bonobo Git Server的BUG：修改库路径可能会导致配置文件被破坏&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;话说上面我屏蔽掉这个友好的错误信息之后才发现原来是这个错误导致的服务器错误：&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="995"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="993"&gt;         &lt;p&gt;w3wp.exe Error: 0 : Error occured and caught in Global.asax - System.InvalidOperationException: There is an error in XML document (5, 17). ---&amp;gt; System.Xml.XmlException: Data at the root level is invalid. Line 5, position 17.            &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlTextReaderImpl.Throw(Exception e)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlTextReaderImpl.ParseDocumentContent()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlTextReaderImpl.Read()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlTextReader.Read()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.XmlReader.ReadEndElement()             &lt;br /&gt;&amp;#160;&amp;#160; at System.Xml.Serialization.XmlSerializationReader.ReadEndElement()             &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserConfiguration.Read2_UserConfiguration(Boolean isNullable, Boolean checkType)             &lt;br /&gt;&amp;#160;&amp;#160; at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUserConfiguration.Read3_Configuration()             &lt;br /&gt;…….&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;看到服务器返回的错误信息再去看看原来的错误日志，果然有这个错误，只是夹杂在一堆HttpException中太不引人注目了。打开 App_Data\config.xml 一看果然文件不对，最后多出了几个字符“ion&amp;gt;”。&lt;/p&gt;  &lt;p&gt;为什么多出这么几个字符很让我费解。后来突然想明白了，之前曾经改过GIT库的路径，于是又去做了试验：先将库路径设置为“D:\Git”，保存，然后再修改为“D:\”，再保存。两次保存的 config.xml 内容如下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201107/201107191230442195.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="7(Q$4Q]ZVQ7`{ZFTED922W3" border="0" alt="7(Q$4Q]ZVQ7`{ZFTED922W3" src="http://images.cnblogs.com/cnblogs_com/nicch/201107/201107191230471092.jpg" width="575" height="411" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;可以看到，库路径变短后文件末尾便多出了那么几个字符。由此可以推测，在保存 config.xml 的时候，它使用了覆写的模式，并且在保存前没有清空源文件，这就导致在新配置内容短于原配置时，原文件最后多出来的字符便充当了“配置杀手”，破坏了配置文件。&lt;/p&gt;  &lt;p&gt;看看它的源码确认一下：（UserConfigurationManager.cs）&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;void&lt;/span&gt; Save() { &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; file = &lt;span style="color: blue"&gt;new&lt;/span&gt;&amp;#160;&lt;span style="color: #2b91af"&gt;FileStream&lt;/span&gt;(_configPath, &lt;span style="color: #2b91af"&gt;FileMode&lt;/span&gt;.OpenOrCreate)) &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _serializer.Serialize(file, Configuration); &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;    &lt;li&gt;} &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;可以看到打开文件模式是 OpenOrCreate，其实这里应该用 FileMode.Create，否则就会存在此BUG。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;关于 web.config 需要注意的地方&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;我遇到的错误之一就是请求的流长度过长。由于提交是需要POST过去的，所以请求的内容长度将会视提交的内容而变化。我第一次提交过去是整个解决方案提交的，整个包是4.1M，于是便出错了，无法提交。在IIS7或以上长度限制默认是256K，IIS6是4M。要修改很简单，打开web.config，在 &amp;lt;system.web&amp;gt; 节下面加上一个子节：&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;httpRuntime&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;maxRequestLength&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;102400&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;这里修改为100M——似乎有点大，但是老衲认为并没有很大问题。值得注意的是，在IIS7以上平台运行时，即便做过这样的设置，限制还是有的，并且不是100M，而是大约28.6M左右，这是因为在IIS7或以上的服务器还有一个 maxAllowedContentLength 限制，这个默认值是 30000000，单位是字节，大约就是 28.6M。所以要突破此限制，&amp;lt;system.webserver&amp;gt; 这里也要一并添加：&lt;/p&gt;  &lt;ol style="color: black" &gt;   &lt;li&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;security&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;requestFiltering&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;requestLimits&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: red"&gt;maxAllowedContentLength&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;102400000&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;requestLimits&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;requestFiltering&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;    &lt;li&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;security&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;至此，这个问题便可以解决了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;汉化成中文版&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Bonobo Git Server 自带了多语言机制，所以很容易翻译成中文，只要对 Resources.resx 加上一个 zh-CN 的区域设置就可以了。不过在它的代码中，取当前用户语言用的是 Request.Languages 进行获得的，并且取的是前两位代码，而不是全部；换句话说，我设置自己的浏览器区域为 zh-CN的话，它识别的区域其实是 zh。关于这点我就很费解了，因为除了英语以外，它还自带了 cs-CZ 语言（原谅我不知道这个是哪国的），照此设置的话其实这个语言在客户端浏览器设置为 cs-CZ 为首选语言时是无法自动切换的（不过并不影响手动切换）。&lt;/p&gt;  &lt;p&gt;因为上面的原因，我对源码进行了点点的修改，切换语言用的是完整的区域代码，并且没有标记语言时使用服务器默认的语言，而不是英文。前台的页面和样式表也进行了部分的修改，去掉了图标展示……个人感觉图标太不直观啦，太小了。还有就是语言需要手动加上，这个不够方便。&lt;/p&gt;  &lt;p&gt;截图如下：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201107/201107191235247518.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201107/201107191235257909.png" width="937" height="349" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;下载链接：&lt;a title="http://www.u-tide.com/fish/Service.asmx/Download/39/39" href="http://www.u-tide.com/fish/Service.asmx/Download/39/39"&gt;http://www.u-tide.com/fish/Service.asmx/Download/39/39&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;发布页面：&lt;a href="http://www.u-tide.com/fish/soft/bonobo_git_server_mod/"&gt;http://www.u-tide.com/fish/soft/bonobo_git_server_mod/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;更改说明：     &lt;br /&gt;&lt;/strong&gt;[!] 基于 2011.04.13 源码版本构建    &lt;br /&gt;[+] 修正保存配置时可能会破坏配置文件的BUG    &lt;br /&gt;[*] 修改设置语言时设置的区域代码    &lt;br /&gt;[*] 修改了web.config 中关于文件长度限制的配置    &lt;br /&gt;[*] 修改了前台页面和样式表中关于语言切换的内容    &lt;br /&gt;[+] 增加了简体中文的界面语言&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使用说明     &lt;br /&gt;&lt;/strong&gt;------------------------------------------------------------    &lt;br /&gt;解压Patch下的文件并覆盖服务器软件根目录覆盖已有文件即可。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;注意&lt;/font&gt;&lt;/strong&gt;：    &lt;br /&gt;1.如果有自行编译过项目，请将App_GlobalResources下的文件加入项目后重新编译，而不要使用包中的bin下的文件，以防更改丢失；    &lt;br /&gt;2.如果有自行修改过web.config，请不要覆盖已有的 web.config ，以免配置丢失；    &lt;br /&gt;3.如果有自行修改过前台界面，请确认修改不会和补丁包中的文件冲突。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;相关链接&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a title="dudu的博客" href="http://dudu.cnblogs.com/" target="_blank"&gt;Dudu&lt;/a&gt; ，《&lt;a href="http://www.cnblogs.com/dudu/archive/2011/06/24/git_on_windows.html"&gt;用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器&lt;/a&gt;》&lt;/li&gt;    &lt;li&gt;Jeff Widmer，《&lt;a href="http://weblogs.asp.net/jeffwids/archive/2009/09/24/from-iis6-maxrequestlength-to-iis7-maxallowedcontentlengthfile-specifying-maximum-file-upload-size.aspx" target="_blank"&gt;From IIS6 maxRequestLength to IIS7 maxAllowedContentLengthFile – specifying maximum file upload size&lt;/a&gt;》&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.chodounsky.net/bonobo-git-server/" target="_blank"&gt;Bonobo Git Server&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/2110431.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/07/19/bonobo_git_server_chs.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/04/14/2015948.html</id><title type="text">一点杂碎: 为IIS Express加上文件夹菜单/两个 region 的 snippet</title><summary type="text">凑点儿东西一起扔上首页，不是很深的技术性话题，不过蛮实用的我觉得。 内容提纲：如何为文件夹加上右键菜单，可以直接作为网站打开如何在VS中快速地插入 #region 1.为IIS Express加上文件夹菜单之前看到有园友发了一篇“网站开发必备-快速浏览Asp.Net网站绿色小工具”，他那个是拿微软官方的 Cassini 源码重新改写而成的，方便是很方便，可惜只支持.Net 2.0。如果想测试 .Net 4.0 的怎么办呢？最好的方案就是用IIS Express了。关于IIS Express的命令行语法可以参考我之前的文章“IIS Express的配置和注意点”。但是命令行操作终究是太麻烦了，怎</summary><published>2011-04-14T05:55:00Z</published><updated>2011-04-14T05:55:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/04/14/2015948.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/04/14/2015948.html"/><content type="html">&lt;p&gt;凑点儿东西一起扔上首页，不是很深的技术性话题，不过蛮实用的我觉得。    &lt;br /&gt;内容提纲：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;如何为文件夹加上右键菜单，可以直接作为网站打开&lt;/li&gt;&#xD;
&lt;li&gt;如何在VS中快速地插入 #region &lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.为IIS Express加上文件夹菜单&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;之前看到有园友发了一篇&amp;ldquo;&lt;a href="http://www.cnblogs.com/waw/archive/2011/04/10/2011794.html"&gt;网站开发必备-快速浏览Asp.Net网站绿色小工具&lt;/a&gt;&amp;rdquo;，他那个是拿微软官方的 &lt;a target="_blank" href="http://www.asp.net/downloads/archived-v11/cassini"&gt;Cassini&lt;/a&gt; 源码重新改写而成的，方便是很方便，可惜只支持.Net 2.0。如果想测试 .Net 4.0 的怎么办呢？最好的方案就是用IIS Express了。&lt;/p&gt;&#xD;
&lt;p&gt;关于IIS Express的命令行语法可以参考我之前的文章&amp;ldquo;&lt;a target="_blank" href="http://www.cnblogs.com/nicch/archive/2011/03/20/how_to_use_iis_express.html"&gt;IIS Express的配置和注意点&lt;/a&gt;&amp;rdquo;。但是命令行操作终究是太麻烦了，怎么样才能快速地调用呢？当然是加上菜单。&lt;/p&gt;&#xD;
&lt;p&gt;保存以下的注册表代码为注册表文件并导入:&lt;/p&gt;&#xD;
&lt;p&gt;32位操作系统:&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;pre&gt;Windows Registry Editor Version 5.00&lt;/pre&gt;&#xD;
&lt;pre&gt;[HKEY_CLASSES_ROOT\Directory\shell\iisexpress]&lt;br /&gt;"Extended"=""&lt;br /&gt;"NoWorkingDirectory"=""&lt;br /&gt;@="使用 IIS Express 作为网站打开"&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\Directory\shell\iisexpress\command]&lt;br /&gt;@="\"C:\\Program Files\\IIS Express\\iisexpress.exe\" \"/path:%1\" /port:2099 /clr:v4.0 /systray:true"&lt;/pre&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;64位操作系统(主要就是个程序文件路径不一样):&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;pre&gt;Windows Registry Editor Version 5.00&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\Directory\shell\iisexpress]&lt;br /&gt;"Extended"=""&lt;br /&gt;"NoWorkingDirectory"=""&lt;br /&gt;@="使用 IIS Express 作为网站打开"&lt;br /&gt;&lt;br /&gt;[HKEY_CLASSES_ROOT\Directory\shell\iisexpress\command]&lt;br /&gt;@="\"C:\\Program Files (x86)\\IIS Express\\iisexpress.exe\" \"/path:%1\" /port:2099 /clr:v4.0 /systray:true"&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 21px; white-space: normal;"&gt;值得注意的是，因为我觉得这个菜单使用并不是那么频繁，所以特别加入了扩展开关。平时右击文件夹是没有的（省得每次都看到），需要使用的话，需要按住Shift再右击：&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201104/201104141340292418.png"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/nicch/201104/201104141353422086.png" alt="快照3" title="快照3" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" border="0" height="149" width="334" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在命令行中指定的端口是2099（这个数字多浪漫啊&amp;hellip;&amp;hellip;），.Net 4.0的CLR，可以通过 /clr:v4.0 修改，特殊情况下需要2.0和4.0两个版本时，再加上一个菜单就行了 ^_^。当然，前提是要你已经安装过 IIS Express，好在这家伙个头也很小。启动后，你可以通过 &lt;span style="text-decoration: underline;"&gt;http://localhost:2099/&lt;/span&gt; 访问。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.两个 region 的 snippet&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;C#中的region可以折叠代码区域相信大家都很熟悉，其实在js中也能实现&amp;hellip;&amp;hellip;就是安装VS2010的扩展 &lt;a target="_blank" href="http://visualstudiogallery.msdn.microsoft.com/0696ad60-1c68-4b2a-9646-4b5f4f8f2e06"&gt;JSEnhancements&lt;/a&gt;。它能实现在js中类似region代码的折叠，不过它使用的是比较复杂的语法&amp;hellip;&amp;hellip;&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;pre&gt;&lt;span style="color: #008000;"&gt;//#region 测试区域&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; test() {&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #008000;"&gt;//#endregion&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;最终的显示效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201104/201104141354077236.png"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/nicch/201104/201104141354205067.png" alt="快照6" title="快照6" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" border="0" height="159" width="241" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不过老实说我觉得这打得太麻烦了，就算是C#中能直接打&amp;nbsp; #region &amp;hellip;. #endregion 我都嫌麻烦。于是我就想到了 snippet。&lt;/p&gt;&#xD;
&lt;p&gt;下面这两个分别是C#和JS的region片段，复制到记事本并分别另存为 region_c#.snippet 和 region_js.snippet，注意要保存为 UTF-8编码（最好有个专门的目录存放这些自定义的snippet，这样用起来方便些）。&lt;/p&gt;&#xD;
&lt;p&gt;C#：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;CodeSnippet&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;Format&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;1.1.0&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;xmlns&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Header&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Title&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Title&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Author&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;木鱼(fishcn@foxmail.com)&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Author&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Shortcut&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Shortcut&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Description&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region XML 注释的代码段&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Description&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetTypes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetType&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Expansion&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetType&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetTypes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Header&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Snippet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Declarations&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Literal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ID&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;name&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ToolTip&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region 标题&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ToolTip&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Default&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;RegionName&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Default&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Literal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Declarations&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;Language&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;csharp&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#808080" style="color: #808080;"&gt;#region $name$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#808080" style="color: #808080;"&gt;$selected$$end$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #808080;" color="#808080"&gt;&lt;span&gt;#endregion&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;]]&amp;gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Snippet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;CodeSnippet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;JS：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;CodeSnippet&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;Format&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;1.1.0&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;xmlns&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Header&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Title&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Title&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Author&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;木鱼(fishcn@foxmail.com)&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Author&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Shortcut&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Shortcut&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Description&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region XML 注释的代码段&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Description&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetTypes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetType&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Expansion&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetType&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;SnippetTypes&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Header&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Snippet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Declarations&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Literal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ID&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;name&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ID&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ToolTip&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;region 标题&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;ToolTip&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Default&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;RegionName&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Default&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Literal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Declarations&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;Language&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;jscript&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&amp;gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#808080" style="color: #808080;"&gt;//#region $name$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#808080" style="color: #808080;"&gt;$selected$$end$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #808080;" color="#808080"&gt;&lt;span&gt;//#endregion&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;]]&amp;gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Code&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;Snippet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;CodeSnippet&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;打开VS，通过&amp;ldquo;工具&amp;rdquo;-&amp;ldquo;代码段管理器&amp;rdquo;打开管理器，通过&amp;ldquo;添加&amp;rdquo;或&amp;ldquo;导入&amp;rdquo;分别在 JScript和C#类别下分别加入这两个 snippet，收工~~&lt;/p&gt;&#xD;
&lt;p&gt;以后在js或cs文件中，输入 region 就能看到这两个snippet，连续按两次TAB即可快速插入：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201104/201104141354224742.png"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/nicch/201104/201104141354259466.png" alt="快照5" title="快照5" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" border="0" height="227" width="456" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;收工~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/2015948.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/04/14/2015948.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/03/20/how_to_use_iis_express.html</id><title type="text">IIS Express 的配置、使用和注意点</title><summary type="text">VS2010的SP1引入了IIS Express支持，这是值得高兴的事情……因为自带的ASP.net Development Server只能单站点运行、不能设置虚拟目录、多少个项目就会出现多少个等等等等巴拉巴拉，我对它恨之入骨，总之，很长一段时间内我进行开发实际上都是用IIS的。但是用IIS有不方便的地方，就是必须开启IIS Admin服务，而且VS必须以管理员模式运行才能正常打开项目和调试。每次都以管理员模式启动已经比较麻烦了，比较郁闷的是，以管理员模式启动的vs处于特权状态，所以程序间的文件拖放就失效了……换句话说，如果我想从资源管理器中直接拖一个文件到vs中打开，就办不到了。所以对II</summary><published>2011-03-19T16:40:00Z</published><updated>2011-03-19T16:40:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/03/20/how_to_use_iis_express.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/03/20/how_to_use_iis_express.html"/><content type="html">&lt;p&gt;VS2010的SP1引入了IIS Express支持，这是值得高兴的事情&amp;hellip;&amp;hellip;因为自带的ASP.net Development Server只能单站点运行、不能设置虚拟目录、多少个项目就会出现多少个等等等等巴拉巴拉，我对它恨之入骨，总之，很长一段时间内我进行开发实际上都是用IIS的。但是用IIS有不方便的地方，就是必须开启IIS Admin服务，而且VS必须以管理员模式运行才能正常打开项目和调试。每次都以管理员模式启动已经比较麻烦了，比较郁闷的是，以管理员模式启动的vs处于特权状态，所以程序间的文件拖放就失效了&amp;hellip;&amp;hellip;换句话说，如果我想从资源管理器中直接拖一个文件到vs中打开，就办不到了。&lt;/p&gt;&#xD;
&lt;p&gt;所以对IIS Express一直是比较期待的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;本文包含内容&lt;/strong&gt;：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;关于IIS Express的介绍&lt;/li&gt;&#xD;
&lt;li&gt;IIS Express的配置文件中网站的配置&lt;/li&gt;&#xD;
&lt;li&gt;如何在VS2010中配置IIS Express&lt;/li&gt;&#xD;
&lt;li&gt;如何避免需要管理员身份启动IIS Express&lt;/li&gt;&#xD;
&lt;li&gt;IIS Express比较有用的命令行参数&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.关于IIS Express的介绍&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/"&gt;Scottgu&lt;/a&gt; 在 &lt;a href="http://weblogs.asp.net/scottgu/archive/2011/01/13/announcing-release-of-asp-net-mvc-3-iis-express-sql-ce-4-web-farm-framework-orchard-webmatrix.aspx#7685211"&gt;这篇文章&lt;/a&gt; 中介绍了伴随着ASP.net MVC 3而来的新东西，其中就包含IIS Express 7.5，介绍如下：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;轻量，易于安装，安装包不到5M； &lt;/li&gt;&#xD;
&lt;li&gt;从VS中启动、调试应用程序不需要管理员身份； &lt;/li&gt;&#xD;
&lt;li&gt;带有完整的WEB服务器功能支持&amp;mdash;&amp;mdash;支持SSL、URL回写以及其它IIS7.x的模块 &lt;/li&gt;&#xD;
&lt;li&gt;和IIS7.x完全一致的web.config配置模型 &lt;/li&gt;&#xD;
&lt;li&gt;可以和IIS、ASP.net Development Server 同时安装，没有任何冲突 &lt;/li&gt;&#xD;
&lt;li&gt;支持XP及更高的操作系统，在所有的系统上都提供IIS7.x一致的开发功能 &lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;关于IIS Express常规的安装、使用，相关介绍的文章比较多，我就不多说了。这里说说没怎么见人提的地方。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.关于配置文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;默认情况下IIS Express使用的配置文件位于&amp;ldquo;我的文档&amp;rdquo;中，路径如下：&amp;ldquo;我的文档\IIS Express\Config&amp;rdquo;。其中，applicationhost.config 是核心的配置文件，它用于承载站点的定义、应用程序和应用程序池以及整个WEB服务器的配置。由于是放在我的文档中的，所以修改它不需要管理员权限，意味着可以直接修改。在修改后，下次启动应用程序就会起效。&lt;/p&gt;&#xD;
&lt;p&gt;在applicationhost.config内容中，&amp;lt;system.applicationHost&amp;gt; 用于定义网站和应用程序池。默认情况下，其内容如下：&lt;/p&gt;&#xD;
&lt;ol style="font-family: consolas; color: black; font-size: 12px;" &gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;system.applicationHost&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;applicationPools&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Clr4IntegratedAppPool&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedRuntimeVersion&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;v4.0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedPipelineMode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Integrated&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;CLRConfigFile&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%IIS_USER_HOME%\config\aspnet.config&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;autoStart&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Clr4ClassicAppPool&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedRuntimeVersion&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;v4.0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedPipelineMode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Classic&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;CLRConfigFile&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%IIS_USER_HOME%\config\aspnet.config&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;autoStart&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Clr2IntegratedAppPool&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedRuntimeVersion&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;v2.0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedPipelineMode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Integrated&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;CLRConfigFile&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%IIS_USER_HOME%\config\aspnet.config&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;autoStart&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Clr2ClassicAppPool&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedRuntimeVersion&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;v2.0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedPipelineMode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Classic&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;CLRConfigFile&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%IIS_USER_HOME%\config\aspnet.config&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;autoStart&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;UnmanagedClassicAppPool&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedRuntimeVersion&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;""&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedPipelineMode&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Classic&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;autoStart&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;applicationPoolDefaults&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;managedRuntimeLoader&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;v4.0&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;processModel&lt;/span&gt;&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;applicationPoolDefaults&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;applicationPools&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The &amp;lt;listenerAdapters&amp;gt; section defines the protocols with which the&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows Process Activation Service (WAS) binds.&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue;"&gt;--&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;listenerAdapters&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;add&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;listenerAdapters&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sites&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;site&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;name&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;WebSite1&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;id&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;serverAutoStart&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;application&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;path&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;virtualDirectory&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;path&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;/&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;physicalPath&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;%IIS_SITES_HOME%\WebSite1&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;application&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;bindings&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;binding&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;protocol&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;http&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;bindingInformation&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;:8080:localhost&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;bindings&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;site&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;applicationDefaults&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;applicationPool&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;Clr4IntegratedAppPool&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;virtualDirectoryDefaults&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: red;"&gt;allowSubDirConfig&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;true&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;sites&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515;"&gt;webLimits&lt;/span&gt;&lt;span style="color: blue;"&gt; /&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;li&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515;"&gt;system.applicationHost&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;IIS Express 内建了五个应用程序池，分别对应.Net 2.0/4.0的集成/经典模式、以及一个非托管程序池。默认的程序池版本有 &amp;lt;spplicationPoolDefaults&amp;gt; 节来配置。&amp;lt;sites&amp;gt; 节用于配置网站。网站的默认应用程序池和虚拟目录默认配置由 &amp;lt;applicationDefaults&amp;gt; 和 &amp;lt;virtualDirectoryDefaults&amp;gt; 节点配置。以上的节点默认情况下我们并不需要太多关注，因为大多数情况下我们需要关注的只有 &amp;lt;sites&amp;gt; 下的 &amp;lt;site&amp;gt; 节点，这里保存了网站、应用程序的定义，才是我们需要真正关心的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;①.每个 &amp;lt;site&amp;gt; 就是一个网站。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这和IIS中的网站是一样的概念。serverAutoStart 设置了是否随着 IIS Express的启动而自动启动。如果设置为true，那么每次 IIS Express 启动都会自动加载（如果没有指定网站的话），否则只有以指定特定网站的模式运行时才会加载。&lt;/p&gt;&#xD;
&lt;p&gt;使用IIS Express加载特定网站的语法是：&amp;nbsp; IISExpress.exe /site:&amp;lt;站点名&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;②.&amp;lt;site&amp;gt; 下的&amp;lt;bindings&amp;gt;设置了这个站点的绑定信息。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;节点下的每个&amp;lt;binding&amp;gt;都是一个端口绑定信息。典型的绑定配置如下：&amp;lt;binding protocol="http" bindingInformation="*:8080:localhost" /&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;protocol 指定了绑定的协议类型（IIS Express内建了 HTTP 和 HTTPS两种协议支持），而&amp;ldquo;*:8080:localhost&amp;rdquo;则指定的绑定的具体信息，它有三个部分组成：&amp;ldquo;绑定的IP:端口:主机名&amp;rdquo;。默认情况下，绑定到任何本地IP、非保留端口、绑定到localhost。注意这个localhost，有讲究，特定情况下可能会导致你很困惑，请参考本文后面的内容。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;③.&amp;lt;application&amp;gt; 这个节设置了网站的应用程序&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;每个网站都需要至少一个映射路径为&amp;ldquo;/&amp;rdquo;应用程序（它映射到根目录）。除此之外，你可以继续添加并行的不同路径的 &amp;lt;application&amp;gt; ，这就类似于IIS中的网站里配置的应用程序。&lt;/p&gt;&#xD;
&lt;p&gt;例如，在FishSite这个网站中，我需要添加一个单独的应用程序，映射到根目录下的fish目录，那么我就可以这样配置：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;site&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;FishSite&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;2&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;application&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;path&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;applicationPool&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;Clr2IntegratedAppPool&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;virtualDirectory&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;path&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;physicalPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;lt;网站的根目录&amp;gt;&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;application&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;application&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;path&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;/fish&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;applicationPool&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;Clr2IntegratedAppPool&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;virtualDirectory&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;path&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;/&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;physicalPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;lt;此应用程序的根目录&amp;gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;virtualDirectory&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;path&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;/content/&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;physicalPath&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&amp;lt;/fish/content/ 目录对应的虚拟目录&amp;gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;application&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;bindings&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;binding&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;protocol&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;http&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;bindingInformation&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;=&lt;/span&gt;&lt;/span&gt;"&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;*:5000:localhost&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;bindings&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Consolas" style="font-family: Consolas;"&gt;&lt;span&gt;&lt;span color="#0000ff" style="color: #0000ff;"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;lt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span color="#a31515" style="color: #a31515;"&gt;site&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size: 9pt; color: #0000ff;" color="#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;在&amp;lt;site&amp;gt;中，只有 path="/" 这个应用程序是必须的（不能缺少），其它都是可以任意添加的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;④.&amp;lt;virtualDirectory&amp;gt; 设置了目录的映射信息&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参见上面展示的代码。在每个&amp;lt;application&amp;gt;节下，必须至少存在一个 path="/" 的 virtualDirectory，它代表了这个目录映射的位置。除此之外，可以手动添加多个映射的路径不同的虚拟目录。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.关于虚拟目录的支持&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS Express支持虚拟目录，这是对我来说很重要的一个改进，因为实际的项目中经常有很多目录是共享的，比如上传目录、配置文件目录等等，在ASP.net Development Server中这些都是办不到的。&lt;/p&gt;&#xD;
&lt;p&gt;IIS Express的站点模型和IIS是一致的，最基本的是站点，站点下可以区分应用程序、虚拟目录。&lt;/p&gt;&#xD;
&lt;p&gt;配置文件中如何手动创建它们，请参考上节中的介绍自行创建。在VS中如何创建呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;①，将使用IIS或ASP.net Development Server的项目迁移到IIS Express上&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;注意：你需要安装 VS2010 SP1来让VS2010支持IIS Express。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在&amp;ldquo;解决方案管理器&amp;rdquo;中右击网站项目，并选择&amp;ldquo;使用IIS Express&amp;hellip;.&amp;rdquo;即可：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040093793.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040092681.png" width="383" height="77" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;VS会使用一个新的默认端口在IIS Express中创建网站。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;②，如果你想要将当前项目作为一个虚拟目录映射到现有的某个站点或新网站的根目录下，那么推荐在项目属性中更改（项目属性-WEB）：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040103727.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040104774.png" width="703" height="170" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;输入完成后，直接点击&amp;ldquo;创建虚拟目录&amp;rdquo;即可完成转换操作。VS将会自动在本机的IIS Express中完成配置。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;③，如果想映射到一个本地目录（比如资源共享，上传目录等）到IIS Express承载网站的应用程序下&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;那么可以参考上面介绍的配置文件手动更改。貌似IIS Express 中的 appcmd 也可以更改，不过个人觉得这类简单的配置，直接编辑就搞定了，用 appcmd 的话还需要先去学习怎么用它，怪麻烦的。&lt;/p&gt;&#xD;
&lt;p&gt;例子可以参考前面相关的内容。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4.关于管理员身份启动&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS Express设计是为了避免需要管理员权限就能完成大部分操作的。但是个别情况下它会要需要管理员权限才能运行（我当时在这里就栽了跟头，研究了N久）。这类的限制包括：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;绑定到了保留的端口（通常位于1024以下的端口，如80、88、443等）；&lt;/li&gt;&#xD;
&lt;li&gt;没有绑定localhost，而是绑定了域名或其它内容；&lt;/li&gt;&#xD;
&lt;li&gt;使用了HTTPS，但是端口不在44300-44399范围内；&lt;/li&gt;&#xD;
&lt;li&gt;使用了自己的SSL证书的HTTPS。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;①，使用了保留的端口&lt;/p&gt;&#xD;
&lt;p&gt;通常操作系统的HTTP.sys（网络内核）将1024以下的端口设计为保留端口，如果IIS Express需要绑定到这些端口，则需要它拥有管理员权限，否则就会失败。错误类似这样：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040101153.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040141346.png" width="527" height="137" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;反映到系统的日志中，就是这样的错误：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040141280.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/nicch/201103/201103200040151214.png" width="811" height="218" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;要解决这个问题，很简单，只要将端口绑定到非保留端口即可（大于1024），或使用管理员身份启动它&lt;sup&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;备注1&lt;/span&gt;&lt;/sup&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;②，绑定了其它域名&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;默认情况下，IIS Express只能绑定到 localhost。如果需要绑定到具体的域名供外部访问而又没有解决方案，那么就会遭遇到失败的问题。&lt;/p&gt;&#xD;
&lt;p&gt;要解决，也很简单&amp;mdash;&amp;mdash;就是使用管理员身份启动它&lt;sup&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;备注1&lt;/span&gt;&lt;/sup&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;③，使用了HTTPS，但是端口不在 44300-44399之内&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS Express用于承载HTTPS站点测试时，端口会限制在44300-44399之内，这同样是操作系统的限制。如果超过了这个范围，则需要以管理员身份启动它才能正常工作&lt;sup&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;备注1&lt;/span&gt;&lt;/sup&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;④，使用了自己的SSL证书的HTTPS&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS Express默认会安装一个测试的自签名证书用于开发，这允许开发人员在没有SSL证书的情况下进行开发。但是如果站点使用了自己的SSL证书，则会导致IIS Express需要管理员身份才能启动&lt;sup&gt;&lt;span color="#ff0000" style="color: #ff0000;"&gt;备注1&lt;/span&gt;&lt;/sup&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5.关于命令行启动选项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;①，使用自己的config文件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;默认情况下IIS Express会使用在&amp;ldquo;我的文档&amp;rdquo;中保存的 applicationhost.config。但是如果我们以命令行模式启动它，则可以指定配置文件的路径。&lt;/p&gt;&#xD;
&lt;p&gt;命令行是：&amp;nbsp; iisexpress /config:&amp;lt;配置文件路径&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于团队开发，这会比较有用，比如创建全局的config签入到源代码管理中，这样能同步全局的服务器目录结构配置（当然，如果小项目或者没有目录映射的话就没多大意义了）。启动IIS Express使用此命令行启动，就省去了每次牵出项目还得配置IIS Express的麻烦（同时，开发服务器的配置可以直接保存到项目中，也就避免了每个人的开发服务器可能有差别）。&lt;/p&gt;&#xD;
&lt;p&gt;这种情况下，调试可以使用VS的&amp;ldquo;附加到进程&amp;rdquo;来完成。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;②，启动一个临时网站&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有些情况下，我们需要启动一个临时的网站（比如快速创建一个临时服务器等），便可以用类似的命令行来创建：&lt;/p&gt;&#xD;
&lt;p&gt;iisexpress /path:&amp;lt;网站目录&amp;gt; /port:&amp;lt;端口&amp;gt; /clr:&amp;lt;CLR版本，V2.0|V4.0&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;iis express会复制一份配置文件到临时目录，并变更其中的站点信息后再启动，因此不会影响到本机已经配置的网站。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6.结束语&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS Express的出现让我着实高兴了一番，相比 ASP.net Development Server的过于简单、使用IIS每次都要以管理员身份启动VS来说，IIS Express给我们提供了一个很好的折衷方案。&lt;/p&gt;&#xD;
&lt;p&gt;虽然接受它需要花点儿功夫 :-)&lt;/p&gt;&#xD;
&lt;p&gt;备注1：可以使用 netsh (vista或win7/2008) 或 httpcfg 来更改系统注册表的配置，请参考：&lt;a title="http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/" href="http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/"&gt;http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/&lt;/a&gt;    &lt;br /&gt;备注2：更多的关于不使用管理员身份运行 IIS Express的信息，请参考：&lt;a title="http://learn.iis.net/page.aspx/1003/running-iis-express-without-administrative-privileges/" href="http://learn.iis.net/page.aspx/1003/running-iis-express-without-administrative-privileges/"&gt;http://learn.iis.net/page.aspx/1003/running-iis-express-without-administrative-privileges/&lt;/a&gt;    &lt;br /&gt;备注3：更多的关于命令行运行 IIS Express的信息，请参考：&lt;a title="http://learn.iis.net/page.aspx/870/running-iis-express-from-the-command-line/" href="http://learn.iis.net/page.aspx/870/running-iis-express-from-the-command-line/"&gt;http://learn.iis.net/page.aspx/870/running-iis-express-from-the-command-line/&lt;/a&gt;    &lt;br /&gt;备注4：更多的关于IIS Express托盘图标的信息，请参考：&lt;a title="http://learn.iis.net/page.aspx/869/using-the-windows-system-tray-to-manage-websites-and-applications/" href="http://learn.iis.net/page.aspx/869/using-the-windows-system-tray-to-manage-websites-and-applications/"&gt;http://learn.iis.net/page.aspx/869/using-the-windows-system-tray-to-manage-websites-and-applications/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/1989192.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/03/20/how_to_use_iis_express.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/03/09/vs2010_sp1_download.html</id><title type="text">Visual Studio 2010 Service Pack1(10.0.40219.1) 发布（附在线安装程序/中英文离线安装包）</title><summary type="text">都说微软的东西必须等到SP1才能用~关于VS2010 SP1究竟有哪些改进、添加了什么新功能，请参考：http://msdn.microsoft.com/en-us/visualc/gg697159VS2010 SP1于2011年3月8日正式发布，公开下载将于3月11日开放。老衲没有MSDN订阅帐号……但是目前已有在线安装包被放出来，不过在线安装过于慢，所以我提取了在线安装所需要的所有补丁并重新整...</summary><published>2011-03-09T08:57:00Z</published><updated>2011-03-09T08:57:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/03/09/vs2010_sp1_download.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/03/09/vs2010_sp1_download.html"/><content type="html">&lt;p&gt;都说微软的东西必须等到SP1才能用~关于VS2010 SP1究竟有哪些改进、添加了什么新功能，请参考：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/visualc/gg697159"&gt;http://msdn.microsoft.com/en-us/visualc/gg697159&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;VS2010 SP1于2011年3月8日正式发布，公开下载将于3月11日开放。老衲没有MSDN订阅帐号&amp;hellip;&amp;hellip;但是目前已有在线安装包被放出来，不过在线安装过于慢，所以我提取了在线安装所需要的所有补丁并重新整合到一个压缩包中，生成了这个离线安装包。考虑到大部分人仅需要中英文的补丁，所以这个包去掉了所有的非中、英文语言补丁，因此大小只有约完整镜像（1.48G）的50%（经7z压缩后710M），下载后可以直接离线安装，无需再从网上下文件（当然，为保险起见，最好还是不要断网~）。&lt;/p&gt;&#xD;
&lt;p&gt;因为仅包含中、英文文件，所以如果是其它语言（如繁体中文等）安装，需要在线再下载一些支持文件（大小约50-80M，视语言而不同），当然应该比下完整版的1.48G都要划算了（参考说明）。&lt;/p&gt;&#xD;
&lt;p&gt;完整的版本（ISO ）在3月11日即将公开下载，而且其体积过大（1.48G），我就不放出来了，需要完整版的同学耐心等待一两天即可。&lt;/p&gt;&#xD;
&lt;p&gt;（&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注：所有的补丁都是我通过分析XML手动下载的，不是从MSDN上获取的ISO镜像再修改的。请网速不错的同学选择在线安装，可能下载的内容更少。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;我制作这个安装包只是为了方便在线安装不方便、或者觉得官方的1.48G太大、收藏起来有点浪费而重新打包的、没有对任何文件进行修改，对文件或版权有疑虑的同学，请自觉等MS公开发布，谢绝下载此处文件！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;）&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;微软MSDN上的原说明&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table width="690" cellspacing="0" cellpadding="3" border="0" style="border-bottom: 1px solid #cccccc;"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" style="border-left: solid 1px #cccccc;" colspan="2"&gt;&lt;span &gt;File Name:&lt;/span&gt;&amp;nbsp;&lt;span &gt;mu_visual_studio_2010_sp1_x86_x64_dvd_651704.iso&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" style="border-left: solid 1px #cccccc; width: 55%;"&gt;&lt;span &gt;Date Published (UTC):&lt;/span&gt;&amp;nbsp;&lt;span &gt;3/8/2011 9:13:36 AM&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td valign="top"&gt;&lt;span &gt;Last Updated (UTC):&lt;/span&gt;&amp;nbsp;&lt;span &gt;3/8/2011 10:20:52 AM&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" style="border-left: solid 1px #cccccc;"&gt;&lt;span &gt;SHA1:&lt;/span&gt;&amp;nbsp;&lt;span &gt;61C2088850185EDE8E18001D1EF3E6D12DAA5692&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td valign="top"&gt;&lt;span &gt;ISO/CRC:&lt;/span&gt;&amp;nbsp;&lt;span &gt;C77C2A14&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" style="border-left: solid 1px #cccccc;" colspan="2"&gt;&lt;span &gt;Available to Levels:&lt;/span&gt;&amp;nbsp;&lt;span &gt;MSDN OS (VL);&amp;nbsp;VS Pro with MSDN Premium (Empower);&amp;nbsp;MSDN OS (Retail);&amp;nbsp;Developer AA;&amp;nbsp;Designer AA;&amp;nbsp;VS Pro with MSDN (Retail);&amp;nbsp;VS Premium with MSDN (MPN);&amp;nbsp;VS Pro with MSDN Premium (MPN);&amp;nbsp;BizSpark Admin;&amp;nbsp;BizSpark;&amp;nbsp;VS Pro with MSDN Embedded (Retail);&amp;nbsp;WebsiteSpark Admin;&amp;nbsp;WebsiteSpark;&amp;nbsp;VS Pro with MSDN Embedded (VL);&amp;nbsp;VS Test Pro with MSDN (VL);&amp;nbsp;VS Ultimate with MSDN (VL);&amp;nbsp;VS Premium with MSDN (VL);&amp;nbsp;VS Pro with MSDN (VL);&amp;nbsp;VS Test Pro with MSDN (Retail);&amp;nbsp;MSDN Essentials;&amp;nbsp;VS Premium with MSDN (Retail);&amp;nbsp;VS Ultimate with MSDN (Retail);&amp;nbsp;MSDN for Action Pack;&amp;nbsp;Expression Professional (Retail);&amp;nbsp;Expression Professional (VL);&amp;nbsp;VS Ultimate with MSDN (MPN);&amp;nbsp;MSDN AA Institution;&amp;nbsp;VS Ultimate with MSDN (NFR FTE);&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" style="border-left: solid 1px #cccccc;" colspan="2"&gt;&lt;span &gt;Instructions and Resources&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" style="border-left: solid 1px #cccccc;" colspan="2"&gt;&lt;span &gt;&#xD;
&lt;p&gt;&lt;b&gt;IMPORTANT NOTE:&lt;/b&gt; Do not install this Service Pack if you have downloaded and installed the stand-alone &amp;lsquo;Microsoft Windows SDK for Windows 7 and .NET Framework 4 (Windows SDK v7.1)&amp;rsquo; and you are using the x64 or IA64 compilers that were included in that download. Please see the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=212355"&gt;related article&lt;/a&gt; for more information.&lt;/p&gt;&#xD;
&lt;p&gt;This ISO image includes an installer for Visual Studio 2010 Service Pack 1. To minimize download size, consider using the Web Installer.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;NOTE:&lt;/b&gt; This installer is for all editions of Visual Studio 2010 (Express, Professional, Premium, Ultimate, and Test Professional).&lt;/p&gt;&#xD;
&lt;p&gt;The following languages are included: Chinese-Simplified, Chinese-Traditional, English, French, German, Italian, Japanese, Korean, Russian, and Spanish.&lt;/p&gt;&#xD;
&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;这次发布的SP1包含了下列语言：英文，简体中文，繁体中文，法语，德语，印度语，日语，韩语，俄语以及西班牙语。&lt;/p&gt;&#xD;
&lt;p&gt;值得注意的是，如果之前曾经安装过&amp;ldquo;Microsoft Windows SDK for Windows 7 and .NET Framework 4 (Windows SDK v7.1)&amp;rdquo;并且使用了其中的x64或IA64编译器，那么安装SP1可能会出现问题，具体解决方法请查看：&lt;a href="http://go.microsoft.com/fwlink/?LinkID=212355"&gt;http://go.microsoft.com/fwlink/?LinkID=212355&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;安装说明&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果你是安装简体中文版或英文版VS2010的SP1，那么下载后直接安装即可。&lt;/p&gt;&#xD;
&lt;p&gt;如果非中文版、英文版VS2010、而在上面的语言列表中的，可以按以下方法安装：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;下载在线安装程序（后面有）；&lt;/li&gt;&#xD;
&lt;li&gt;当然你可以选择直接在线装&amp;hellip;&amp;hellip;如果不想在线等几百M的东西下完，可以继续看 :-)；&lt;/li&gt;&#xD;
&lt;li&gt;下载简体中文的离线安装包；&lt;/li&gt;&#xD;
&lt;li&gt;用WinRAR解压在线安装程序；再解压中文的离线安装包，并将文件夹里面（注意是压缩包的文件夹里面）的所有文件覆盖到在线安装包的程序目录中；&lt;/li&gt;&#xD;
&lt;li&gt;启动在线安装包的安装程序，此时需要下载一些丢失的语言文件（视语言不同，需要下载的文件在20-80M不等）&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下载&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在线安装程序：&lt;a href="http://u.115.com/file/t3ba631b3a"&gt;http://u.115.com/file/t3ba631b3a&lt;/a&gt;&amp;nbsp;（794K）&lt;/p&gt;&#xD;
&lt;p&gt;中/英文离线安装程序：&lt;i&gt;&lt;span rel="select"&gt;&lt;a href="http://u.115.com/file/f099493137"&gt;http://u.115.com/file/f099493137&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;（710M）&lt;/p&gt;&#xD;
&lt;p&gt;（&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;注：所有的补丁都是我通过分析XML手动下载的，不是从MSDN上获取的ISO镜像再修改的。请网速不错的同学选择在线安装，可能下载的内容更少。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;我制作这个安装包只是为了方便在线安装不方便、或者觉得官方的1.48G太大、收藏起来有点浪费而重新打包的、没有对任何文件进行修改，对文件或版权有疑虑的同学，请自觉等MS公开发布，谢绝下载此处文件！&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;）&lt;/p&gt;&#xD;
&lt;p&gt;完整的包足足1.48G，况且两天后就可以直接下了，这里放出的意义不是很大，就不放出来了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/1978477.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/03/09/vs2010_sp1_download.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/02/25/copyashtml_for_productivetools2010.html</id><title type="text">发布一个最新版Productivity Power Tools中的CopyAsHtml扩展的修改版（含工具和源码）</title><summary type="text">Productivity Power Tools是微软官方发布的一个用于VS2010的扩展，功能是在Visual Studio的文本编辑器中按下Ctrl+C或通过其它方式执行“复制”或者“剪切”功能的时候，生成一份HTML格式的源码放到剪贴板中，此时可以在网页编辑器、网页中的可视化编辑器中直接粘贴出和VS中格式相同的源码。今天这个工具发布了最新的版本，其中CopyAsHtml组件进行了更新，加入了选项对话框，个人觉得这个比较实用，所以将原来的组件修改迁移到这个版本中。值得一提的，原来我发布的修改版存在一个BUG，就是当选择的内容存在不需要的缩进时，会导致缩进丢失，感谢之前mangohappy给</summary><published>2011-02-24T16:15:00Z</published><updated>2011-02-24T16:15:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/02/25/copyashtml_for_productivetools2010.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/02/25/copyashtml_for_productivetools2010.html"/><content type="html">&lt;p&gt;&lt;a target="_blank" href="http://visualstudiogallery.msdn.microsoft.com/d0d33361-18e2-46c0-8ff2-4adea1e34fef"&gt;Productivity Power Tools&lt;/a&gt;是微软官方发布的一个用于VS2010的扩展，功能是在Visual Studio的文本编辑器中按下Ctrl+C或通过其它方式执行&amp;ldquo;复制&amp;rdquo;或者&amp;ldquo;剪切&amp;rdquo;功能的时候，生成一份HTML格式的源码放到剪贴板中，此时可以在网页编辑器、网页中的可视化编辑器中直接粘贴出和VS中格式相同的源码。&lt;/p&gt;&#xD;
&lt;p&gt;今天这个工具发布了最新的版本，其中CopyAsHtml组件进行了更新，加入了选项对话框，个人觉得这个比较实用，所以将原来的组件修改迁移到这个版本中。值得一提的，原来我发布的修改版存在一个BUG，就是当选择的内容存在不需要的缩进时，会导致缩进丢失，感谢之前&lt;a target="_blank" href="http://home.cnblogs.com/u/mangohappy/"&gt;mangohappy&lt;/a&gt;给我的反馈和在我发布的源码基础上进行的改进。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.这个和官方的组件相比有和更改？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;和官方组件相比，变更如下：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;允许在生成最终代码时，忽略部分VS的文字编辑器样式（比如背景色，文字大小，文字样式等等）&lt;/li&gt;&#xD;
&lt;li&gt;使用OL来代替Pre显示代码区域，并允许加上class类名以便于在网页中进行代码样式的微调，支持显示行号（可以通过后期定义样式隐藏）&lt;/li&gt;&#xD;
&lt;li&gt;能在复制或剪切时自动移除公共缩进（见后说明，仅针对HTML）&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.什么是自动移除公共缩进？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里指的公共缩进，就是指下面这个代码片段中所标注的区域：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201102/2011022500144915.png"&gt;&lt;img height="294" width="852" src="http://images.cnblogs.com/cnblogs_com/nicch/201102/20110225001449539.png" alt="vs_ppt_copyashtml_enhance_removeblank" border="0" title="vs_ppt_copyashtml_enhance_removeblank" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果要复制这个方法，修改后的扩展在复制后将会自动将红框中的缩进删除掉，于是复制出来的代码是这样的：&lt;/p&gt;&#xD;
&lt;ol  style="line-height: normal; background: #f4fff4; margin-left: 30pt;"&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span style="font-size: 9pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; GenerateHtml(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;NormalizedSnapshotSpanCollection&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; spans, &lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;IWpfTextView&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; textView)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; ((spans == &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;) || (spans.Count == &lt;/span&gt;&lt;span&gt;&lt;span style="color: #9f5000;" color="#9f5000"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;""&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;_DTE&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;) &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;._serviceProvider.GetService(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;typeof&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;_DTE&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;))).get_Properties(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;"Productivity Power Tools"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;, &lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;"HTML Copy"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;IClassificationFormatMap&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; classificationFormatMap = &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;._classificationFormatMappingService.GetClassificationFormatMap(textView);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;IClassificationType&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; classificationType = &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;._classificationTypeRegistry.GetClassificationType(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;"text"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;HtmlMarkupProvider&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; htmlMarkupProvider = &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;HtmlMarkupProvider&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;(classificationFormatMap, classificationType, textView);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;IClassifier&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; classifier = &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;._classifierAggregatorService.GetClassifier(textView.TextBuffer);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; str = &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;FormattedStringBuilder&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;(htmlMarkupProvider, classifier, classificationType).AppendSnapshotSpans(spans);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;IDisposable&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; disposable = classifier &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff00ff;" color="#ff00ff"&gt;IDisposable&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; (disposable != &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disposable.Dispose();&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; str;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.选项对话框的说明&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我对选项对话框进行了修改，删除了一个选项，添加了几个选项：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102250014496602.png"&gt;&lt;img height="497" width="761" src="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102250014502981.png" alt="vs_ppt_copyashtml_enhance_options" border="0" title="vs_ppt_copyashtml_enhance_options" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4.如何重定义代码块样式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;建议在上述的选项对话框中设置CodeBlockClassName，这样通过ol.CodeBlockClassName既可以重新设置样式。比如我的博客中重定义的样式如下，需要的同学可以参考下：&lt;/p&gt;&#xD;
&lt;ol  style="line-height: normal; background: #f4fff4; margin-left: 30pt;"&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;&lt;span style="font-size: 9pt;"&gt;ol.codeBlock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;border&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;1px&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;dotted&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;#6C93FF&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;line-height&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;:&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;150%&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;word-break&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;:&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;break-word&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;font-family&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;Consolas,&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;Verdana&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;strong&gt;!important&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;border-radius&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;:&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;5px&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;&lt;span style="font-size: 9pt;"&gt;ol.codeBlock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;font&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;font-size&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;:&lt;/span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span&gt;12px&lt;/span&gt;&lt;span&gt;&lt;strong&gt;!important&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;&lt;span style="font-size: 9pt;"&gt;ol.codeBlock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;background-color&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;#E3E3FF&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;strong&gt;!important&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;list-style-position&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;outside&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;margin-left&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;:&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;0px&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;&lt;span style="font-size: 9pt;"&gt;ol.codeBlock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;li&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;background-color&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;#fff&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;padding-left&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;5px&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;border-left&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;1px&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;solid&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;#8A8AFF&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;margin-left&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;:&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;50px&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;&lt;span style="font-size: 9pt;"&gt;ol.codeBlock&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #800080;" color="#800080"&gt;li:nth-child(even)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;background-color&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;: &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;#f5f5f5&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span color="#000000" style="font-size: 9pt; color: #000000;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5.如何使用&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载附件，将解压后的 CopyAsHtml.dll 解压到 "%LocalAppData%\Microsoft\VisualStudio\10.0\Extensions\Microsoft\Productivity Power Tools\10.0.20214.15" 下并覆盖已有文件即可。&lt;/p&gt;&#xD;
&lt;p&gt;源码需要VS2010才能打开。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;6.下载链接&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;DLL下载：&lt;a href="http://www.u-tide.com/fish/Service.asmx/Download/30/25" title="http://www.u-tide.com/fish/Service.asmx/Download/30/25"&gt;http://www.u-tide.com/fish/Service.asmx/Download/30/25&lt;/a&gt;    &lt;br /&gt;源码下载：&lt;a href="http://www.u-tide.com/fish/Service.asmx/Download/30/26" title="http://www.u-tide.com/fish/Service.asmx/Download/30/26"&gt;http://www.u-tide.com/fish/Service.asmx/Download/30/26&lt;/a&gt;    &lt;br /&gt;发布页面：&lt;a href="http://www.u-tide.com/fish/soft/copyAsHtml_For_ProductiveTools2010/" title="http://www.u-tide.com/fish/soft/copyAsHtml_For_ProductiveTools2010/"&gt;http://www.u-tide.com/fish/soft/copyAsHtml_For_ProductiveTools2010/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后发个疑问。为啥官方的扩展中这个dll只有25K，为啥我编译的会有40K呢？搞不明白。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/1964360.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/02/25/copyashtml_for_productivetools2010.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/02/14/simple_updater.html</id><title type="text">发布一个原创小类库：.Net 小型软件自动更新库（SimpAutoUpdater），已附上客户端+包生成工具源码</title><summary type="text">本类库+工具用于快速实现一个简单的自动更新程序，旨在快速简单地为现有的.Net应用程序添加上比较简单的自动更新功能。在发布应用程序时，我们经常会需要给自己的程序加上自动升级功能。.Net Framework自带的ClickOnce中有自动升级的功能，但是往往不太好用，比如必须用ClickOnce发布，安装的文件夹一个版本一个等等，我们会想要一个比较简单、甚至绿色软件也能使用的自动升级功能，这个自动...</summary><published>2011-02-14T15:17:00Z</published><updated>2011-02-14T15:17:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/02/14/simple_updater.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/02/14/simple_updater.html"/><content type="html">&lt;p&gt;本类库+工具用于快速实现一个简单的自动更新程序，旨在快速简单地为现有的.Net应用程序添加上比较简单的自动更新功能。&lt;/p&gt;&#xD;
&lt;div style="line-height: normal;" &gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;在发布应用程序时，我们经常会需要给自己的程序加上自动升级功能。.Net Framework自带的ClickOnce中有自动升级的功能，但是往往不太好用，比如必须用ClickOnce发布，安装的文件夹一个版本一个等等，我们会想要一个比较简单、甚至绿色软件也能使用的自动升级功能，这个自动升级程序就是基于这个目的而制作的。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;为了让使用起来更加简单快捷，我对内置的功能进行了大幅度的精简和集成，最简单的情况下只需要你只需要一行代码即可实现自动更新，如下所示：&lt;/span&gt;&lt;/span&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol style="background-color: #f4fff4; margin-left: 30pt;" &gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;FSLib.App.SimpleUpdater.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Updater&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.CheckUpdateSimple(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;&lt;a href="http://ls.com/update.xml"&gt;http://ls.com/update.xml&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt; &lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本类库+工具用于快速实现一个简单的自动更新程序，可以简单地完成小型应用程序的快速更新。&lt;/p&gt;&#xD;
&lt;p&gt;整个工具分成两部分，一部分是供用户使用的类库，一部分是用于生成更新包的工具。&lt;/p&gt;&#xD;
&lt;p&gt;基于 .Net 3.5 开发，原则上最好安装有此版的 .netFramework。特殊情况下，可以仅安装 .Net Framework 2.0SP1，发布的时候附带上 System.Core.dll 即可正常运行。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;整个自动升级工作的流程&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102142317287954.jpg"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="2d70e14a-d474-4b75-a12a-562d2bce7b74" border="0" alt="2d70e14a-d474-4b75-a12a-562d2bce7b74" src="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102142317286285.jpg" width="676" height="481" /&gt;&lt;/a&gt;    &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;更新包生成工具&lt;/strong&gt;&lt;/p&gt;&#xD;
&amp;nbsp;&#xD;
&lt;p&gt;作为一个简单的升级需求，不需要很复杂的设置。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102142317286809.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="1de73525-2e99-4160-9e62-e71b2694b198" border="0" alt="1de73525-2e99-4160-9e62-e71b2694b198" src="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102142317297332.png" width="603" height="498" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;需要填写如下信息：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;&lt;strong&gt;应用程序名&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;当前的版本&lt;/strong&gt;（也就是更新后的版本） &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;发布地址可选&lt;/strong&gt;（如果填写了，在更新提示框上会有个链接可以链接到这个网址） &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;新程序目录&lt;/strong&gt;（选择最新版本程序的发布目录） &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;升级包路径&lt;/strong&gt;：选择一个路径用来保存升级包(*.zip)，同时自动更新信息 *.xml 也会保存在这个目录下 &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;更新前执行&lt;/strong&gt;：在下载完成、即将安装更新前会执行这里选择的程序。这里有点BUG一旦选择了就不能取消，所以请注意下； &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;更新后执行&lt;/strong&gt;：在安装完成后、即将退出前执行的操作。需要注意的BUG同上。通常选择需要运行的主程序。 &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;执行时间限制&lt;/strong&gt;：用于限制6中选择的程序的执行时间，超过设置的时间后进程将会被强行结束。 &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;更新说明&lt;/strong&gt;：用于提示更新的时候显示的文本消息内容。 &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;创建&lt;/strong&gt;：按照填写的信息生成升级包 &lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;打开&lt;/strong&gt;：打开一个已有的升级信息文件，用于下次更新版本时直接修改信息即可，其它的不需要变化。 &lt;/li&gt;&#xD;
&lt;/ol&gt;  &lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;发布更新包&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;更新包应该发布到服务器上。生成的文件有两个，一个是压缩包(&lt;i&gt;*.zip&lt;/i&gt;)，一个是信息文件(&lt;i&gt;*.xml&lt;/i&gt;)，两个应该一起发布。这里假定通过网址 &lt;i&gt;http://ls.com/update.xml&lt;/i&gt; 能访问到生成的 &lt;i&gt;update.xml&lt;/i&gt; 文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;为应用程序添加自动更新功能&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：自动升级程序取当前程序文件的版本，是以当前运行的程序集版本作为识别依据的。&lt;/p&gt;&#xD;
&lt;p&gt;首先在VS中为当前的主程序项目添加引用，引用&amp;ldquo;客户端&amp;rdquo;中的&amp;ldquo;&lt;em&gt;SimpleUpdater.exe&lt;/em&gt;&amp;rdquo;。&lt;/p&gt;&#xD;
&lt;p&gt;在VS中，点开&amp;ldquo;解决方案管理器&amp;rdquo;中相应项目的&amp;ldquo;属性&amp;rdquo;节点，打开 AssemblyInfo.cs 文件，在最下面添加上一行自动更新声明：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;这步是必须的，否则请求检查更新时会抛出异常；代码中的网址即上面提到的能访问到xml文件的网址。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;如果您&lt;/span&gt;&lt;/span&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;希望更加简单的使用而不用去加这样的属性，或者您想程序运行的时候自定义，您可以通过下列方式的任何一种方式取代上面的属性声明：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;使用 &lt;span style="font-size: 12pt;"&gt;&lt;em&gt;&lt;span style="color: #000000;" color="#000000"&gt;FSLib.App.SimpleUpdater.&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Updater&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.CheckUpdateSimple(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;"升级网址"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;)&lt;/span&gt;&lt;/em&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span color="#000000"&gt;的重载方法。这个重载方法允许你传入一个升级包的地址；&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;在检查前手动设置 FSLib.App.SimpleUpdater.Updater.UpdateUrl 属性。这是一个静态属性，也就是说，您并不需要创建 FSLib.App.SimpleUpdater.Updater.UpdateUrl 的对象实例就可以修改它。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;无论使用哪种方式，请确保在检查更新前，地址已经设置。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman"&gt;&lt;span color="#000000"&gt;到这里，准备工作即告完成，为代码添加上检查更新的操作即可。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="line-height: normal; text-indent: 0pt;"&gt;&lt;span style="font-family: Times New Roman;" face="Times New Roman"&gt;&lt;span style="color: #000000; font-size: 12pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ol style="line-height: normal; background-color: #f4fff4; margin-left: 30pt;" &gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;&lt;span style="font-size: 9pt;"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af; font-size: 9pt;" color="#2b91af"&gt;Program&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #808080;" color="#808080"&gt;///&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000;" color="#008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080; font-size: 9pt;" color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #808080;" color="#808080"&gt;///&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt; 应用程序的主入口点。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #808080;" color="#808080"&gt;///&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000;" color="#008000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #808080; font-size: 9pt;" color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;STAThread&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; Main()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Application&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.EnableVisualStyles();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Application&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.SetCompatibleTextRenderingDefault(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; updater = FSLib.App.SimpleUpdater.&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Updater&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.Instance;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;//当检查发生错误时,这个事件会触发&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; updater.Error += &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;EventHandler&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;(updater_Error);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;//没有找到更新的事件&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; updater.NoUpdatesFound += &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;EventHandler&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;(updater_NoUpdatesFound);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;//找到更新的事件.但在此实例中,找到更新会自动进行处理,所以这里并不需要操作&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;//updater.UpdatesFound += new EventHandler(updater_UpdatesFound);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;//开始检查更新-这是最简单的模式.请现在 assemblyInfo.cs 中配置更新地址,参见对应的文件.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSLib.App.SimpleUpdater.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Updater&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.CheckUpdateSimple();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 如果您希望更加简单的使用而不用去加这样的属性，或者您想程序运行的时候自定义，您可以通过下列方式的任何一种方式取代上面的属性声明：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 使用Updater.CheckUpdateSimple 的重载方法。这个重载方法允许你传入一个升级包的地址；&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * 在检查前手动设置 FSLib.App.SimpleUpdater.Updater.UpdateUrl 属性。这是一个静态属性，也就是说，您并不需要创建 FSLib.App.SimpleUpdater.Updater.UpdateUrl 的对象实例就可以修改它。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #008000; font-size: 9pt;" color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSLib.App.SimpleUpdater.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Updater&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.CheckUpdateSimple(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;"升级网址"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Application&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.Run(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Form1&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; updater_UpdatesFound(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; sender, &lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;EventArgs&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; updater_NoUpdatesFound(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; sender, &lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;EventArgs&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Windows.Forms.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;MessageBox&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.Show(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #a31515;" color="#a31515"&gt;"没有找到更新"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;static&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; updater_Error(&lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;object&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; sender, &lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;EventArgs&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; e)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; updater = sender &lt;/span&gt;&lt;span&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;as&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt; FSLib.App.SimpleUpdater.&lt;/span&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;Updater&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000;" color="#000000"&gt;&lt;span style="font-size: 9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Windows.Forms.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9pt;"&gt;&lt;span&gt;&lt;span style="color: #2b91af;" color="#2b91af"&gt;MessageBox&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;" color="#000000"&gt;.Show(updater.Exception.ToString());&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li style="list-style-type: decimal;"&gt;&lt;span style="font-family: Consolas;" face="Consolas"&gt;&lt;span style="color: #000000; font-size: 9pt;" color="#000000"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;结束&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;详细的代码请参考附带的示例项目。&lt;/p&gt;&#xD;
&lt;p&gt;检查到更新时窗口如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102142317298727.png"&gt;&lt;img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="28bfbc14-2a3d-49bb-9092-d913a1399d62" border="0" alt="28bfbc14-2a3d-49bb-9092-d913a1399d62" src="http://images.cnblogs.com/cnblogs_com/nicch/201102/201102142317291759.png" width="352" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这之后的更新操作都是全自动执行的，不需要在主程序中有任何其它操作。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;关于开源&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当前发布的类库中并未包含源码，因为较多的细节尚未完善。但是有很多同学表示有兴趣，所以这里放出一个源码包，请参见下一节下载。&lt;/p&gt;&#xD;
&lt;p&gt;仅供参考，被误导我可不管 :-)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下载&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;库直接下载链接：&lt;a title="http://www.u-tide.com/fish/Service.asmx/Download/33/28" href="http://www.u-tide.com/fish/Service.asmx/Download/33/28"&gt;http://www.u-tide.com/fish/Service.asmx/Download/33/28&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;源码包直接下载：&lt;a href="http://www.u-tide.com/fish/Service.asmx/Download/33/29"&gt;http://www.u-tide.com/fish/Service.asmx/Download/33/29&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;发布页面：&lt;a title="http://www.u-tide.com/fish/soft/simple_autoupdater/index.html" href="http://www.u-tide.com/fish/soft/simple_autoupdater/index.html"&gt;http://www.u-tide.com/fish/soft/simple_autoupdater/index.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;简单使用说明：&lt;a href="http://www.u-tide.com/fish/soft/simple_autoupdater/usage.html"&gt;http://www.u-tide.com/fish/soft/simple_autoupdater/usage.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果有问题或建议，请回复此日志，到讨论区反馈： &lt;a title="http://www.u-tide.com/fish/Discussion.asmx/Index/33" href="http://www.u-tide.com/fish/Discussion.asmx/Index/33"&gt;http://www.u-tide.com/fish/Discussion.asmx/Index/33&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/1954753.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/02/14/simple_updater.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2011/01/08/1930875.html</id><title type="text">VS2010中WinForm中，&amp;ldquo;属性&amp;lt;属性名&amp;gt;的代码生成失败&amp;rdquo;的问题，熟悉WinForm组件开发的同学进来讨论下</title><summary type="text">UPDATED: 提供了可替换的解决方案，请参照本文末尾。     这是一个困扰我很久的问题，一直没有解决，搜索英文版的网站也没有能解决。姑且放在首页，用VS2010做过组件开发的同学进来讨论下。 简介：当一个在界面上提供扩展属性的组件（实现IExtenderProvider接口）使用项目引用或处在同一个项目里的时候，项目重编译后，组件上自定义的类别转换器将无法访问对应的类型，出现类型转换失败。 ...</summary><published>2011-01-08T12:16:00Z</published><updated>2011-01-08T12:16:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2011/01/08/1930875.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2011/01/08/1930875.html"/><content type="html">&lt;p&gt;&lt;font color="#ff0000"&gt;UPDATED: 提供了可替换的解决方案，请参照本文末尾。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;这是一个困扰我很久的问题，一直没有解决，搜索英文版的网站也没有能解决。姑且放在首页，用VS2010做过组件开发的同学进来讨论下。    &lt;br /&gt;简介：当一个在界面上提供扩展属性的组件（实现&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;IExtenderProvider&lt;/font&gt;&lt;/span&gt;接口）使用项目引用或处在同一个项目里的时候，项目重编译后，组件上自定义的类别转换器将无法访问对应的类型，出现类型转换失败。&lt;/p&gt;  &lt;p&gt;下面给出一个示例项目，求证是否是通用的问题还是我的VS设置的问题（源代码可以点此下载：&lt;a title="http://files.cnblogs.com/nicch/vs2010_component_version_test.rar" href="http://files.cnblogs.com/nicch/vs2010_component_version_test.rar"&gt;http://files.cnblogs.com/nicch/vs2010_component_version_test.rar&lt;/a&gt;）。&lt;/p&gt;  &lt;p&gt;现在假定要创建一个小组件，继承自系统的Label，功能是提供一个名为TipMessage的扩展属性。基本功能就是当这个Label放在对话框上的时候，可以为每个控件都扩展出一个名为“TipMessage”的属性，当鼠标在对应的控件上移过的时候，这个Label都会显示这个设置好的提示信息。为了稍微复杂一点，这里假定还可以设置文本的颜色，类似于下面的效果：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201101/20110108195454282.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="未命名-1" border="0" alt="未命名-1" src="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101081954555232.jpg" width="604" height="304" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;我们把这个组件和最终的窗体放在同一个项目中。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.先定义一个TipMessage的类，储存提示信息&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;这个类没有什么可说的，直接上代码。&lt;/p&gt;  &lt;pre style="line-height: normal; font-family: " &gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 12pt"&gt;[&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TypeConverter&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessageConvertor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;))]&lt;/font&gt;&lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 创建 &lt;/font&gt;&lt;/span&gt;&lt;font color="#808080"&gt;&lt;span style="color: "&gt;&amp;lt;see cref=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;TipMessage&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt; /&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 的新实例&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; TipMessage()&lt;br /&gt;    {&lt;br /&gt;        Color = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SystemColors&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.ControlText;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 创建 &lt;/font&gt;&lt;/span&gt;&lt;font color="#808080"&gt;&lt;span style="color: "&gt;&amp;lt;see cref=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;TipMessage&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt; /&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 的新实例&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; TipMessage(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; message, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808000"&gt;Color&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; color)&lt;br /&gt;    {&lt;br /&gt;        Message = message;&lt;br /&gt;        Color = color;&lt;br /&gt;    }&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 获得或设置要显示的信息&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Message { &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt;; }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 获得或设置显示的信息&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808000"&gt;Color&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; Color { &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;; }&lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;这里自定义了一个类型转换器，现在遇到的问题主要就是在类型转换器中遇到的。这个类型，当时用VS的默认代码序列化时，会在设计器文件 (*.designer.cs) 生成类似这样的代码：&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="line-height: normal; font-family: " &gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: 12pt"&gt;TipMessage&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; message = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;();&lt;br /&gt;message.Message = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;message.Color = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SystemColors&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ControlText;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;现在觉得这种方式有点累赘，想要将属性直接在构造函数中设置，像这样(有时候这是必须的)：&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="line-height: normal; font-family: " &gt;&lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: 12pt"&gt;TipMessage&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; message = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SystemColors&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ControlText);&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;要生成这样的设计器代码，必须自己重写类别转换器。除此以外，因为 &lt;font face="Consolas"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;&lt;font style="font-size: 12pt"&gt;TipMessage&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;是我们自定义的一个类，VS并没有为它实现默认的设计器，如果不自己定义，那么实际上这个属性在属性窗格中是不可编辑的。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;2.重写一个类别设计器&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;现在实现 &lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessageConvertor&lt;/font&gt;&lt;/span&gt;，继承自 &lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ExpandableObjectConverter&lt;/font&gt;&lt;/span&gt; ，重写与转换相关的四个核心方法。&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="line-height: normal; font-family: " &gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessageConvertor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ExpandableObjectConverter&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; CanConvertFrom(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;ITypeDescriptorContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; context, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; sourceType)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (sourceType == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.CanConvertFrom(context, sourceType);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ConvertFrom(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;ITypeDescriptorContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; context, System.Globalization.&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;CultureInfo&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; culture, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; value)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (value == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (value &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;is&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.IsNullOrEmpty(value.ToString()) ? &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;() { Message = value.ToString() };&lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.ConvertFrom(context, culture, value);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; CanConvertTo(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;ITypeDescriptorContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; context, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; destinationType)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (destinationType == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) || destinationType == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;InstanceDescriptor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.CanConvertTo(context, destinationType);&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ConvertTo(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;ITypeDescriptorContext&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; context, System.Globalization.&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;CultureInfo&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; culture, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; value, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; destinationType)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (value == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; obj = (&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;)value;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 12pt"&gt;	&lt;/font&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font style="font-size: 12pt" color="#008000"&gt;//注意这行,后面会出错&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; &lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (destinationType == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; obj.Message;&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (destinationType == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;InstanceDescriptor&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;))&lt;br /&gt;        {&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; constructor = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;).GetConstructor(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Type&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;[]{&lt;br /&gt;                   &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;),&lt;br /&gt;                   &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808000"&gt;Color&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;            });&lt;br /&gt; &lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;InstanceDescriptor&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(constructor, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;[]{&lt;br /&gt;                obj.Message,obj.Color&lt;br /&gt;           }, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;true&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt;);&lt;br /&gt;        }&lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ConvertTo(context, culture, value, destinationType);&lt;br /&gt;    }&lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;这个类别设计器支持在 &lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt; 和 &lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage &lt;/font&gt;&lt;/span&gt;之间相互转换，除此之外还能将 &lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt; 转换为 &lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;InstanceDescriptor&lt;/font&gt;&lt;/span&gt; 。&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;InstanceDescriptor&lt;/font&gt;&lt;/span&gt; 用来提供对象创建的实例化信息，VS根据它来生成目标对象的构造函数。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;注意代码中的那行注释，问题就在那行中发生。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;3. 生成 TipMessageLabel&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;因为本文不是为了讲述如何生成一个扩展属性的控件，因此对代码不做太详细的描述……有兴趣的同学请搜索相关的介绍文章。&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="line-height: normal; font-family: " &gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&lt;font style="font-size: 12pt"&gt;[&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;ProvideProperty&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#a31515"&gt;&amp;quot;TipMessage&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Control&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;))]&lt;/font&gt;&lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessageLable&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; : &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Label&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff00ff"&gt;IExtenderProvider&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font style="font-size: 12pt"&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;{&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; TipMessageLable()&lt;br /&gt;    {&lt;br /&gt;        _message = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;gt;();&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ForeColor = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;SystemColors&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.ControlText;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;bool&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; CanExtend(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; extendee)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; extendee &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;is&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Control&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &amp;amp;&amp;amp; extendee != &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;    }&lt;br /&gt; &lt;/font&gt;&lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;    #region&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; 扩展属性&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Dictionary&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;&amp;lt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;&amp;gt; _message;&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; 获得与指定控件相关联的提示信息&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;font color="#808080"&gt;&lt;span style="color: "&gt;&amp;lt;param name=&lt;/span&gt;&lt;span style="color: "&gt;&amp;quot;control&amp;quot;&lt;/span&gt;&lt;span style="color: "&gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt;关联的控件&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/param&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;returns&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt;相关的信息.如果没有,则返回null&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; GetTipMessage(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Control&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; control)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; msg = (&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (!_message.TryGetValue(control, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;out&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; msg)) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; msg;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; SetTipMessage(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Control&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; control, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessage&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; value)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (value == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;)&lt;br /&gt;        {&lt;br /&gt;            control.MouseEnter -= &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;EventHandler&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;(ctl_MouseEnter);&lt;br /&gt;            control.MouseLeave -= &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;EventHandler&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;(ctl_MouseLeave);&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; (_message.ContainsKey(control)) _message.Remove(control);&lt;br /&gt;        }&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        {&lt;br /&gt;            control.MouseEnter += &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;EventHandler&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;(ctl_MouseEnter);&lt;br /&gt;            control.MouseLeave += &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#ff0000"&gt;EventHandler&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;(ctl_MouseLeave);&lt;br /&gt; &lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; (_message.ContainsKey(control)) _message[control] = value;&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; _message.Add(control, value);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ctl_MouseLeave(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; sender, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; e)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.Text = _defaultText;&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.ForeColor = _defaultColor;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; ctl_MouseEnter(&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;object&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; sender, &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;EventArgs&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; e)&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; message = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;this&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.GetTipMessage(sender &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;as&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;Control&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;);&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; (message == &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;null&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;) &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt; &lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.Text = message.Message;&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.ForeColor = message.Color;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt; &lt;/font&gt;&lt;br /&gt;&lt;span style="color: "&gt;&lt;font color="#800000"&gt;    #endregion&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; _defaultText;&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808000"&gt;Color&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; _defaultColor;&lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; Gets or sets the text associated with this control.&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;returns&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; The text associated with this control.&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;filterpriority&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#008000"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span style="color: "&gt;&lt;font color="#808080"&gt;&amp;lt;/filterpriority&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;font color="#000000"&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; Text&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        {&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.Text;&lt;br /&gt;        }&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        {&lt;br /&gt;            _defaultText = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.Text = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;public&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;override&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; System.Drawing.&lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#808000"&gt;Color&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt; ForeColor&lt;br /&gt;    {&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;get&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        {&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt; &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;.ForeColor;&lt;br /&gt;        }&lt;br /&gt;        &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font color="#000000"&gt;        {&lt;br /&gt;            _defaultColor = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Consolas"&gt;&lt;font style="font-size: 12pt"&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;            &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;base&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;.ForeColor = &lt;/font&gt;&lt;span style="color: "&gt;&lt;font color="#0000ff"&gt;value&lt;/font&gt;&lt;/span&gt;&lt;font color="#000000"&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;4. 代码测试&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;至此，已经实现了基本的效果。在窗体的设计界面上，添加一个这样的 &lt;span style="color: "&gt;&lt;font color="#2b91af"&gt;TipMessageLable&lt;/font&gt;&lt;/span&gt; 的控件，即能看到每个控件多会出来这样的一个属性：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101081954557675.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Snap11" border="0" alt="Snap11" src="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101081954562069.jpg" width="740" height="341" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;设置好每个按钮的扩展信息后，保存，编译。运行最终的程序，既可以看到最终的结果，与我们预期的相符（见这篇文章的开头）。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;现在我们对代码稍微修改下，并重新编译。此时，问题就出现了。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;重新打开上面窗口的设计器，并修改一些属性，点击保存——VS就会咣当一下蹦出这样的一个对话框：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101082015469634.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Snap6" border="0" alt="Snap6" src="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101082015461520.jpg" width="501" height="344" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;font color="#ff0000"&gt;属性“TipMessage”的代码生成失败。错误是: “[A]ComponentTest.TipMessage 无法强制转换为 [B]ComponentTest.TipMessage。类型 A 源自“ComponentTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”(在上下文“LoadNeither”中的“C:\Users\WF\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies\8hxo9xod01\ComponentTest.exe”位置处)。类型 B 源自“ComponentTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”(在上下文“LoadNeither”中的“C:\Users\WF\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies\dmc6p70601\ComponentTest.exe”位置处)。”&lt;/font&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;似乎VS同时加载了两个版本的程序集，一个是之前编译的，一个是后来编译的。 &#xD;
  &lt;br /&gt;使用ProcessExplorer查看VS加载的DLL，也证实了这种猜测（实际上可以看出来这里加载了4个版本的……）：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101081954581555.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: ; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Snap7" border="0" alt="Snap7" src="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101081954589853.jpg" width="805" height="226" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这里代码生成失败将会导致对相关属性的修改全部丢失。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;每次打开这个项目，VS的设计器里面修改相关的属性，编译后，再去修改这些属性，便会遇到这个问题。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;重置VS的设置似乎没有用。不知道有没有同学能验证下？也期待能有同学给出解决方案。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;测试项目源码在此：&lt;a title="http://files.cnblogs.com/nicch/vs2010_component_version_test.rar" href="http://files.cnblogs.com/nicch/vs2010_component_version_test.rar"&gt;http://files.cnblogs.com/nicch/vs2010_component_version_test.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;UPDATED @ 2011年1月9日&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;--------------------------------&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/shuidao/" target="_blank"&gt;shuidao&lt;/a&gt; 同学&lt;a href="http://www.cnblogs.com/nicch/archive/2011/01/08/1930875.html#2006877" target="_blank"&gt;在这里分析了这个异常发生的原因&lt;/a&gt;。窗体设计器在设计的时候，加载了原始编译的DLL，但是经过项目编译之后，设计器会使用新版本的程序集来生成代码，因此会导致新版本的程序集中的类型和旧版本程序集中的类型冲突，无法相互转换。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;值得一提的是，在VS2008中并没有这样的问题，回想一下在VS2008中，如果重新编译了，窗体设计器会刷新一次，可以猜测为就是为了重新加载最新版本的程序集；但是在VS2010中却看不到这个刷新，也可以猜测正是这里没有刷新导致了这个问题。但是，就算在编译的时候关闭窗体设计器，在编译后重新打开，这样的异常还是会发生，证明VS2010根本就没有打算加载新版本的程序集来进行设计，应该属于VS2010的一个BUG。&#xD;
  &lt;br /&gt;在 Microsoft Connect 上VS Team曾经确认过这是Windows窗体设计器的一个BUG（并且已经标记为已修复），但是昨晚我特地卸载中文版的VS安装上英文版VS并打上SP1Beta补丁后，发现在这个问题依然存在（顺便说一下，SP1Beta补丁安装需要占用系统磁盘2.5G空间），期望落空。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;至于替代的解决方法，&lt;a href="http://www.cnblogs.com/shuidao/" target="_blank"&gt;shuidao&lt;/a&gt; 同学也提供了两条。昨晚我也在尝试使用反射来解决问题，但是这个方法如果对应的属性内容是很麻烦的，又比如还内嵌了其它自定义类型，则会比较麻烦，最好将除了必须在构造函数中指定的对象属性定义为DesignerSerializationVisibility(DesignerSerializationVisibility.Content)，让VS来自动生成代码。另一个方法就是将TipMessage这样的类放在其它项目中，然后本项目只引用DLL，TypeConverter也和TipMessage类分开，这样重新编译的时候就不会导致这样的问题。但是这样做也就局限性，一个是在标记类别转换的时候，必须手动指定程序集的完整名称和类型（VS的做法）；还有一个就是，TipMessage所在项目不是是解决方案中的项目，就算是也不可在解决方案中更改，否则一样会有这个问题发生（想到了可能有更完整的解决方案，但除了更复杂以外似乎没有很方便的做法）。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;可见比较简单的还是使用反射。后面尝试下是否能写个通用的方法来自动绑定旧的类型到新的类型中。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;最后感谢所有参与讨论的同学 &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none"  alt="Smile" src="http://images.cnblogs.com/cnblogs_com/nicch/201101/201101091625388668.png" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/1930875.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2011/01/08/1930875.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nicch/archive/2010/12/15/url_routing_with_two_optional_parameter_in_asp_net_4.html</id><title type="text">这个算是BUG吗? ASP.net 4.0/MVC3 RC2 中, 带有两个可选参数的路由, 同时没有指定参数时将无法生成正确的链接</title><summary type="text">RT， 昨天刚刚升级到RC2， 今天就遇到比较郁闷的问题。 之前看到阿不提到过一些关于MVC3 RC2的BUG，感觉不会太大影响使用。不过今天下午就遇到问题了。本来很简单的路由注册，带有Area的路由， 突然发现用 Html.ActionLink 生成的链接是空地址，觉得很奇怪，用Url.Action测试也是空地址。但是如果调用默认路由的话，链接就完全正常，非常费解。默认的路由注册如下：public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute(&amp;quot;{resource}.axd/{*path</summary><published>2010-12-15T09:08:00Z</published><updated>2010-12-15T09:08:00Z</updated><author><name>木鱼</name><uri>http://www.cnblogs.com/nicch/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nicch/archive/2010/12/15/url_routing_with_two_optional_parameter_in_asp_net_4.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nicch/archive/2010/12/15/url_routing_with_two_optional_parameter_in_asp_net_4.html"/><content type="html">&lt;p&gt;RT， 昨天刚刚升级到RC2， 今天就遇到比较郁闷的问题。 之前看到&lt;a href="http://www.cnblogs.com/hjf1223/" target="_blank"&gt;阿不&lt;/a&gt;提到过一些&lt;a href="http://www.cnblogs.com/hjf1223/archive/2010/12/12/mvc3_rc2.html" target="_blank"&gt;关于MVC3 RC2的BUG&lt;/a&gt;，感觉不会太大影响使用。&lt;/p&gt;&#xD;
&lt;p&gt;不过今天下午就遇到问题了。&lt;/p&gt;&#xD;
&lt;p&gt;本来很简单的路由注册，带有Area的路由， 突然发现用 Html.ActionLink 生成的链接是空地址，觉得很奇怪，用Url.Action测试也是空地址。但是如果调用默认路由的话，链接就完全正常，非常费解。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;默认的路由注册如下：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterRoutes(&lt;span style="color: #2b91af;"&gt;RouteCollection&lt;/span&gt; routes)&lt;br /&gt;{&lt;br /&gt;    routes.IgnoreRoute(&lt;span style="color: #a31515;"&gt;"{resource}.axd/{*pathInfo}"&lt;/span&gt;);&lt;br /&gt; &lt;br /&gt;    routes.MapRoute(&lt;br /&gt;        &lt;span style="color: #a31515;"&gt;"Default"&lt;/span&gt;, &lt;span style="color: green;"&gt;// Route name&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: #a31515;"&gt;"{controller}/{action}/{id}"&lt;/span&gt;, &lt;span style="color: green;"&gt;// URL with parameters&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, action = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, id = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional } &lt;span style="color: green;"&gt;// Parameter defaults&lt;/span&gt;&lt;br /&gt;    );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;区域的路由注册如下：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;override&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterArea(&lt;span style="color: #2b91af;"&gt;AreaRegistrationContext&lt;/span&gt; context)&lt;br /&gt;{&lt;br /&gt;    context.MapRoute(&lt;br /&gt;        &lt;span style="color: #a31515;"&gt;"Report_default"&lt;/span&gt;,&lt;br /&gt;        &lt;span style="color: #a31515;"&gt;"Report/{controller}/{action}/{p1}/{p2}"&lt;/span&gt;,&lt;br /&gt;        &lt;span style="color: blue;"&gt;new&lt;/span&gt; { action = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, p1 = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional, p2 = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional }&lt;br /&gt;    );&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;看似非常正常的路由注册，但是在RC2中，第二段路由是没法生成地址的：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="background: yellow;"&gt;@&lt;/span&gt;Url.Action(&lt;span style="color: #a31515;"&gt;"EmptyBunk"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Rent"&lt;/span&gt; })   =&amp;gt; /Rent/EmptyBunk&lt;br /&gt;&lt;span style="background: none repeat scroll 0% 0% yellow;"&gt;@&lt;/span&gt;Url.Action(&lt;span style="color: #a31515;"&gt;"EmptyBunk"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Rent"&lt;/span&gt;, area = &lt;span style="color: #a31515;"&gt;"Report"&lt;/span&gt; })  =&amp;gt; 空地址&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;span style="background: yellow;"&gt;&amp;nbsp;&lt;/span&gt;但是如果你发现在注册路由时，对可选参数都传递了非空的值（不包括空字符串），会发现地址是正确的：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="background: yellow;"&gt;@&lt;/span&gt;Url.Action(&lt;span style="color: #a31515;"&gt;"EmptyBunk"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Rent"&lt;/span&gt;, area = &lt;span style="color: #a31515;"&gt;"Report"&lt;/span&gt;, p1 = &lt;span style="color: #a31515;"&gt;"123"&lt;/span&gt;, p2 = &lt;span style="color: #a31515;"&gt;"456"&lt;/span&gt; })  =&amp;gt;  /Report/Rent/EmptyBunk/123/456&lt;/pre&gt;&#xD;
&lt;p&gt;一直以为是路由注册中出现了问题，浪费了一个多小时才发现这原来是MVC自己的问题，如果路由规则中存在两个可选参数并且生成路由时没有指定参数值，就会导致生成的链接地址是空地址。&lt;/p&gt;&#xD;
&lt;p&gt;关于这个在Microsoft Connect上已经有人提交了BUG报告：&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/630568/url-routing-with-two-optional-parameters-unspecified-fails-on-asp-net-mvc3-rc2" target="_blank"&gt;http://connect.microsoft.com/VisualStudio/feedback/details/630568/url-routing-with-two-optional-parameters-unspecified-fails-on-asp-net-mvc3-rc2&lt;/a&gt;，不知道园子里是否有人会有一样的问题呢？&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;为了确认的确是ASP.net Routing的问题，创建一个新的MVC项目后做测试。注册路由如下：&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; RegisterRoutes(&lt;span style="color: #2b91af;"&gt;RouteCollection&lt;/span&gt; routes)&lt;br /&gt;{&lt;br /&gt;    routes.IgnoreRoute(&lt;span style="color: #a31515;"&gt;"{resource}.axd/{*pathInfo}"&lt;/span&gt;);&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;    routes.MapRoute(&lt;br /&gt;    &lt;span style="color: #a31515;"&gt;"Default"&lt;/span&gt;, &lt;span style="color: green;"&gt;// Route name&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #a31515;"&gt;"Index/{action}/{id}"&lt;/span&gt;, &lt;span style="color: green;"&gt;// URL with parameters&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, action = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, id = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional } &lt;span style="color: green;"&gt;// Parameter defaults&lt;/span&gt;&lt;br /&gt;);&lt;br /&gt; &lt;br /&gt;    routes.MapRoute(&lt;br /&gt;    &lt;span style="color: #a31515;"&gt;"Default1"&lt;/span&gt;, &lt;span style="color: green;"&gt;// Route name&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #a31515;"&gt;"Test1/{action}/{p1}"&lt;/span&gt;, &lt;span style="color: green;"&gt;// URL with parameters&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test1"&lt;/span&gt;, action = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, p1 = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional } &lt;span style="color: green;"&gt;// Parameter defaults&lt;/span&gt;&lt;br /&gt;);&lt;br /&gt;    routes.MapRoute(&lt;br /&gt;    &lt;span style="color: #a31515;"&gt;"Default2"&lt;/span&gt;, &lt;span style="color: green;"&gt;// Route name&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #a31515;"&gt;"Test2/{action}/{p1}/{p2}"&lt;/span&gt;, &lt;span style="color: green;"&gt;// URL with parameters&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test2"&lt;/span&gt;, action = &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, p1 = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional, p2 = &lt;span style="color: #2b91af;"&gt;UrlParameter&lt;/span&gt;.Optional } &lt;span style="color: green;"&gt;// Parameter defaults&lt;/span&gt;&lt;br /&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;这里没有带上Area，因为实际上有没有Area对结果没有什么影响。 Default的路由是用来显示测试结果的，下面两个才是正事。&lt;/p&gt;&#xD;
&lt;p&gt;Index.cshtml中测试代码如下:&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="background: yellow;"&gt;@helper &lt;/span&gt;DisplayValue(&lt;span style="color: blue;"&gt;string&lt;/span&gt; str)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (&lt;span style="color: blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(str))&lt;br /&gt;    {&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt; &lt;span style="color: red;"&gt;style&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;&lt;span style="color: blue;"&gt;"&lt;/span&gt;&lt;span style="color: red;"&gt;font-style&lt;/span&gt;&lt;span style="color: blue;"&gt;: &lt;/span&gt;&lt;span style="color: blue;"&gt;italic&lt;/span&gt;&lt;span style="color: blue;"&gt;; &lt;/span&gt;&lt;span style="color: red;"&gt;color&lt;/span&gt;&lt;span style="color: blue;"&gt;: &lt;/span&gt;&lt;span style="color: blue;"&gt;Gray&lt;/span&gt;&lt;span style="color: blue;"&gt;;"&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;空地址&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;span&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;span style="background: yellow;"&gt;@&lt;/span&gt;str;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;Url.Action Tests&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test1" }) =&lt;span style="color: red;"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(@Url.Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test1"&lt;/span&gt; }))&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test2" }) =&lt;span style="color: red;"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(Url.Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test2"&lt;/span&gt; }))&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test2", p1 = "", p2 = "" }) =&lt;span style="color: red;"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(Url.Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test2"&lt;/span&gt;, p1 = &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;, p2 = &lt;span style="color: #a31515;"&gt;""&lt;/span&gt; }))&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test2", p1 = "p1" }) =&lt;span style="color: red;"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(Url.Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test2"&lt;/span&gt;, p1 = &lt;span style="color: #a31515;"&gt;"p1"&lt;/span&gt; }))&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test2", p1 = "p1", p2 = "p2" }) =&lt;span style="color: red;"&gt;&amp;amp;gt;&lt;/span&gt; &lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(Url.Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: blue;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #a31515;"&gt;"Test2"&lt;/span&gt;, p1 = &lt;span style="color: #a31515;"&gt;"p1"&lt;/span&gt;, p2 = &lt;span style="color: #a31515;"&gt;"p2"&lt;/span&gt; }))&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;Routes.GetVirtualPathForArea TEST&lt;span style="color: blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: maroon;"&gt;h2&lt;/span&gt;&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background: yellow;"&gt;@{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; dic = &lt;span style="color: blue;"&gt;new&lt;/span&gt; System.Web.Routing.&lt;span style="color: #2b91af;"&gt;RouteValueDictionary&lt;/span&gt;();&lt;br /&gt;dic.Add(&lt;span style="color: #a31515;"&gt;"controller"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Test1"&lt;/span&gt;);&lt;br /&gt;dic.Add(&lt;span style="color: #a31515;"&gt;"action"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: green;"&gt;//for test1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; vp1 = System.Web.Routing.&lt;span style="color: #2b91af;"&gt;RouteTable&lt;/span&gt;.Routes.GetVirtualPath(Request.RequestContext, dic);&lt;br /&gt;&lt;span style="color: green;"&gt;//for test2&lt;/span&gt;&lt;br /&gt;dic.Remove(&lt;span style="color: #a31515;"&gt;"controller"&lt;/span&gt;);&lt;br /&gt;dic.Add(&lt;span style="color: #a31515;"&gt;"controller"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Test2"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; vp2 = System.Web.Routing.&lt;span style="color: #2b91af;"&gt;RouteTable&lt;/span&gt;.Routes.GetVirtualPath(Request.RequestContext, dic);&lt;br /&gt;&lt;span style="color: green;"&gt;//fill optional parameters&lt;/span&gt;&lt;br /&gt;dic.Add(&lt;span style="color: #a31515;"&gt;"p1"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"1"&lt;/span&gt;);&lt;br /&gt;dic.Add(&lt;span style="color: #a31515;"&gt;"p2"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"4"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; vp3 = System.Web.Routing.&lt;span style="color: #2b91af;"&gt;RouteTable&lt;/span&gt;.Routes.GetVirtualPath(Request.RequestContext, dic);&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="background: yellow;"&gt;}&lt;/span&gt;VP1=&lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(vp1 == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: #a31515;"&gt;""&lt;/span&gt; : vp1.VirtualPath)&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;VP2=&lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(vp2 == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: #a31515;"&gt;""&lt;/span&gt; : vp2.VirtualPath)&lt;br /&gt;&lt;span style="color: blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: maroon;"&gt;br&lt;/span&gt; &lt;span style="color: blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;VP3=&lt;span style="background: yellow;"&gt;@&lt;/span&gt;DisplayValue(vp3 == &lt;span style="color: blue;"&gt;null&lt;/span&gt; ? &lt;span style="color: #a31515;"&gt;""&lt;/span&gt; : vp3.VirtualPath)&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;最终的测试页面显示没有出乎我的意料:&lt;/p&gt;&#xD;
&lt;div style="font-size: 75%; font-family: Verdana, Tahoma, Arial, 'Helvetica Neue', Helvetica, sans-serif; color: #232323; background-color: #ffffff;"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Url.Action Tests&lt;/strong&gt;&lt;/p&gt;&#xD;
Url.Action("Index", new { controller = "Test1" }) =&amp;gt; /Test1&lt;br /&gt;Url.Action("Index", new { controller = "Test2" }) =&amp;gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-style: italic; color: gray;"&gt;空地址&lt;/span&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test2", p1 = "", p2 = "" }) =&amp;gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-style: italic; color: gray;"&gt;空地址&lt;/span&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;Url.Action("Index", new { controller = "Test2", p1 = "p1" }) =&amp;gt; /Test2/Index/p1&lt;br /&gt;Url.Action("Index", new { controller = "Test2", p1 = "p1", p2 = "p2" }) =&amp;gt; /Test2/Index/p1/p2&lt;br /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Routes.GetVirtualPathForArea TEST&lt;/strong&gt;&lt;/p&gt;&#xD;
VP1=/Test1&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;VP2=&lt;span style="font-style: italic; color: gray;"&gt;空地址&lt;/span&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;VP3=/Test2/Index/1/4&lt;/div&gt;&#xD;
&#xD;
&lt;p&gt;可见直接使用 Routes.GetVirtualPath 也是无法获得正确结果的，因此可能是ASP.net 4中的Routing组件的问题....但是想想，这个问题应该很容易发现，为什么至今没见到有人提起呢？&lt;/p&gt;&#xD;
&lt;p&gt;不知道园子里有没有同学验证下这个是不是确实存在？晚上在我的台式机上再测试一下。&lt;/p&gt;&#xD;
&lt;p&gt;想掏出Reflector看看流程是不是存在啥问题~~~&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;[UPDATED @ 2010年12月16日 13:08:18]&lt;/p&gt;&#xD;
&lt;p&gt;评论中的两位同学怀疑是我 Url.Action 函数调用的问题。老实说我很奇怪，因为Url.Action函数本身存在8个版本，最终调用的全是 Routes.GetVirtualPath 函数，因此这里用的是哪个本无关紧要。但是为谨慎起见，还是进行测试，证实了 Url.Action(action, controller) 一样存在这个问题。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;PS。这个问题在 ASP.net MVC3 RC1或者 MVC2中是不存在的，因此可能是新引入的问题。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;PS2。在 ASP.net的官方网站上，有关于RC2的临时BUG修复方法：http://weblogs.asp.net/scottgu/archive/2010/12/14/update-on-asp-net-mvc-3-rc2-and-a-workaround-for-a-bug-in-it.aspx，但是根据我的测试，它针对这个BUG是无法修复的，它仅能修复 AllowHtml 无效和可空参数总为null的问题。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nicch/aggbug/1906954.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nicch/archive/2010/12/15/url_routing_with_two_optional_parameter_in_asp_net_4.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
