<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_皮皮虾</title><subtitle type="text">朋哥 http://blog.sina.com.cn/friendwang1001</subtitle><id>http://feed.cnblogs.com/blog/u/15414/rss</id><updated>2012-01-13T09:43:44Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15414/rss"/><entry><id>http://www.cnblogs.com/friendwang1001/archive/2012/01/13/2321904.html</id><title type="text">.NET中锁6大处理方法[转]</title><summary type="text">本文介绍了处理.NET中锁的6种方法，首先我们讨论一下并发性问题，然后讨论处理乐观锁的3种方法，乐观锁不能从根源上解决并发问题，因此后面我们介绍了悲观锁，最后介绍隔离级别如何帮助我们实现悲观锁，每个隔离级别都列举了示例进行说明，使得概念更加清晰。我们为什么需要锁? 在多用户环境中，在同一时间可能会有多个用户更新相同的记录，这就会产生冲突，这个就是著名的并发性问题。 图 1 并行性问题漫画 如何解决并发性问题? 借助正确的锁定策略可以解决并发性问题，资源被锁定后，其它进程想要访问它就会被阻止。 并发会造成什么样的冲突? 并发主要会导致四种常见的问题，详细情况请看下表。问题简要描述解...</summary><published>2012-01-13T09:44:00Z</published><updated>2012-01-13T09:44:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2012/01/13/2321904.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2012/01/13/2321904.html"/><content type="html">&lt;p&gt;本文介绍了处理.NET中锁的6种方法，首先我们讨论一下并发性问题，然后讨论处理乐观锁的3种方法，乐观锁不能从根源上解决并发问题，因此后面我们介绍了悲观锁，最后介绍隔离级别如何帮助我们实现悲观锁，每个隔离级别都列举了示例进行说明，使得概念更加清晰。&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 style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="我们为什么需要锁?" src="http://image20.it168.com/201010_0x0/290/fb8f6cedb2d1f610.jpg" href="/picshow/index289051.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 1 并行性问题漫画&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;strong&gt;并发会造成什么样的冲突?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;并发主要会导致四种常见的问题，详细情况请看下表。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table style="width: 554px; height: 382px" border="1" cellspacing="1" cellpadding="1" width="554" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;问题&lt;/td&gt;&#xD;
&lt;td&gt;简要描述&lt;/td&gt;&#xD;
&lt;td&gt;解释&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;脏读取&lt;/td&gt;&#xD;
&lt;td&gt;当一个事务读取其它完成一半事务的记录时，就会发生脏读取&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;ul&gt;&lt;li&gt;用户A和用户B看到的值都是5&lt;/li&gt;&lt;li&gt;&amp;nbsp;用户B将值修改为2&lt;/li&gt;&lt;li&gt;&amp;nbsp;用户A看到的值仍然是5，这时就发生了脏读取&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;不可重复读取&lt;/td&gt;&#xD;
&lt;td&gt;在每次读数据时，如果你获得的值都不一样，那表明你遇到了不可重复读取问题&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;ul&gt;&lt;li&gt;用户A看到的值是5&lt;/li&gt;&lt;li&gt;用户B将值改为2&lt;/li&gt;&lt;li&gt;用户A刷新后看到的值仍然是5，这时就发生了不可重复读取&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;虚幻行&lt;/td&gt;&#xD;
&lt;td&gt;如果update和delete SQL语句未对数据造成影响，很可能遇到了虚幻行问题&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;ul&gt;&lt;li&gt;用户A将所有值从5修改为2&lt;/li&gt;&lt;li&gt;用户B使用值2插入一个新记录&lt;/li&gt;&lt;li&gt;用户A查询所有值为2的记录，但却找不到，这时就发生了虚幻行&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;更新丢失&lt;/td&gt;&#xD;
&lt;td&gt;一个事务的更新覆盖了其它事务的更新结果，就是所谓的更新丢失&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;ul&gt;&lt;li&gt;用户A将所有值从5更新为2&lt;/li&gt;&lt;li&gt;用户B将所有值从2更新到5&lt;/li&gt;&lt;li&gt;&amp;nbsp;用户A丢失了他的更新&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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 style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="我们为什么需要锁?" src="http://image20.it168.com/201010_0x0/290/ad2cc993ec913bfb.jpg" href="/picshow/index289065.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 2 乐观锁和悲观锁　&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 style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="处理.NET中锁的6种方法" src="http://image20.it168.com/201010_0x0/289/fec23f9778d2307a.jpg" href="/picshow/index288642.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　图 3 乐观锁&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;&amp;#8226; 记录当前的时间戳&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 开始修改值&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 在更新前，检查是否有其他人更新了值(通过检查新旧时间戳实现)&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; &amp;nbsp;如果不相等就回滚，否则就提交&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="处理.NET中锁的6种方法" src="http://image20.it168.com/201010_0x0/289/ca6d948530f40303.jpg" href="/picshow/index288645.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 4 乐观锁的工作原理&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　实现乐观锁的解决方案&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在.NET中，实现乐观锁的方法主要有三种：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 数据集(Dataset)：数据集是实现乐观锁的默认方法，在更新前它会检查新旧值。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; &amp;nbsp;时间戳数据类型(timestamp)：在你的表中创建一个timestamp数据类型，在更新时，检查旧时间戳是否等于新时间戳。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 直接检查新旧值：在更新时检查旧值和新值是否相等，如果不相等就回滚，否则就提交。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决方案1：数据集&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;正如前面所说的，数据集是处理乐观锁的默认方法，下面是一个简单的快照，在Adapter的update函数上有一个调试点，当我移除断点运行update函数时，它抛出如下图所示的并行异常错误。&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="处理.NET中锁的6种方法" src="http://image20.it168.com/201010_0x0/289/eff967a8fdf5544e.jpg" width="543" height="293" href="/picshow/index288648.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 5 Update函数执行时抛出的异常错误&lt;/p&gt;&#xD;
&lt;p&gt;如果你运行后端分析器，你将会看到更新语句检查当前值和旧值是否相等：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;exec sp_executesql N&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;UPDATE [tbl_items] SET [AuthorName] = @p1 WHERE (([Id] = @p2) AND ((@p3 = 1 AND [ItemName] IS NULL) &lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;OR&lt;/span&gt;&lt;span style="color: #000000"&gt; ([ItemName] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @p4)) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; ((@p5 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; [Type] &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IS&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;OR&lt;/span&gt;&lt;span style="color: #000000"&gt; ([Type] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @p6)) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; ((@p7 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; [AuthorName] &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IS&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;OR&lt;/span&gt;&lt;span style="color: #000000"&gt; ([AuthorName] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @p8)) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; ((@p9 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #800080"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;AND&lt;/span&gt;&lt;span style="color: #000000"&gt; [Vendor] &lt;/span&gt;&lt;span style="color: #0000ff"&gt;IS&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;OR&lt;/span&gt;&lt;span style="color: #000000"&gt; ([Vendor] &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; @p10)))&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;,N'@p1 nvarchar(11),@p2 int,@p3 &lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,@p4 nvarchar(&lt;/span&gt;&lt;span style="color: #800080"&gt;4&lt;/span&gt;&lt;span style="color: #000000"&gt;),@p5 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,@p6 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,@p7 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,@p8 nvarchar(&lt;/span&gt;&lt;span style="color: #800080"&gt;18&lt;/span&gt;&lt;span style="color: #000000"&gt;),@p9 &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt;,@p10 nvarchar(&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;,@p1=N'this is new',@p2=2,@p3=0,@p4=N'1001',@p5=0,@p6=3,@p7=0,@p8=N'This is Old &lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;Author&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;,@p9=0,@p10=N'kk'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在这种情况下，我尝试将&amp;#8220;AuthorName&amp;#8221;字段值修改为&amp;#8220;This is new&amp;#8221;，但更新时会检查旧值&amp;#8220;This is old author&amp;#8221;，下面是比较旧值的精简代码段：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;,@p8&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;N&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;This is Old Author'&lt;/span&gt;&lt;/div&gt;&lt;/div&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;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;解决方案2：使用timestamp数据类型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SQL Server有一个数据类型是timestamp，它是实现乐观锁的另一种途径，每次更新SQL Server数据时，时间戳会自动产生一个唯一的二进制数值，时间戳数据类型可用来版本化你的记录更新。&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/74c8a7cf01ea95b1.jpg" href="/picshow/index288673.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　图 6 timestamp数据类型&lt;/p&gt;&#xD;
&lt;p&gt;为了实现乐观锁，首先需要取得旧的时间戳值，在更新时检查旧的时间戳值是否等于当前时间戳，如：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;update tbl_items &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; itemname&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;@itemname where CurrentTimestamp&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;@OldTimeStamp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后检查是否发生了更新操作，如果没有发生更新，则使用SQL Server的raiserror产生一系列错误消息。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(@@rowcount&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;begin&lt;br /&gt;raiserror(&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;Hello some else changed the value',16,10)&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;end&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果发生了并发冲突，当你如下图所示这样调用ExecuteNonQuery时，你应该会看到错误传播。&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/64d6f17c809f1609.jpg" href="/picshow/index288677.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 7 时间戳发生变化，存储过程产生了错误&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　解决方案3：检查旧值和新值&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;许多时候，我们只需要检查相关字段值的一致性，其它字段则可以忽略，在update语句中，我们可以直接做这种比较。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;update tbl_items &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; itemname&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;@itemname where itemname&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;@OldItemNameValue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&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;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/c34d3b2a7c68a68e.jpg" href="/picshow/index288681.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;图 8 悲观锁&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　如何处理悲观锁?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们可以在SQL Server存储过程中指定IsolationLevel(隔离级别)，ADO.NET级别或使用事务范围对象处理悲观锁。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　使用悲观锁可以获得什么样的锁?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;使用悲观锁可以获得四种类型的锁：共享(Shared)、独占(Exclusive)，更新(Update)和意图(Intent)，前两个是真实的锁，后面两个是锁和标记的混合。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table style="width: 530px; height: 143px" border="1" cellspacing="1" cellpadding="1" width="530" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td&gt;何时使用&lt;/td&gt;&#xD;
&lt;td&gt;允许读&lt;/td&gt;&#xD;
&lt;td&gt;允许写&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;共享锁&lt;/td&gt;&#xD;
&lt;td&gt;当你只想读，不希望其它事务进行更新时&lt;/td&gt;&#xD;
&lt;td&gt;是&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;独占锁&lt;/td&gt;&#xD;
&lt;td&gt;当你想修改数据，同时不希望别人可以读，直到你更新完毕时&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td rowspan="4"&gt;更新锁&lt;/td&gt;&#xD;
&lt;td&gt;这是一个混合锁，当你执行的更新操作有多个步骤时使用&lt;/td&gt;&#xD;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;读阶段&lt;/td&gt;&#xD;
&lt;td&gt;是&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;操作阶段&lt;/td&gt;&#xD;
&lt;td&gt;是&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;更新阶段&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;意向锁（请求锁）&lt;/td&gt;&#xD;
&lt;td&gt;意向锁是分级的，当你想锁定下级资源时使用，例如，在表上的一个共享意向锁意味着共享锁是针对页面和表中的行的，&lt;/td&gt;&#xD;
&lt;td&gt;不适用&lt;/td&gt;&#xD;
&lt;td&gt;不适用&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;模式锁&lt;/td&gt;&#xD;
&lt;td&gt;当你修改表结构时使用&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&#xD;
&lt;td&gt;否&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;大数据块更新锁&lt;/td&gt;&#xD;
&lt;td&gt;当你执行大数据块更新时使用&lt;/td&gt;&#xD;
&lt;td&gt;表级（否）&lt;/td&gt;&#xD;
&lt;td&gt;表级（否）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&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 style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/629300fd727b0c8.jpg" href="/picshow/index288727.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　图 9 更新时用到的几种锁&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;不同隔离级别之间的差异，以及何时使用它们&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有4种事务隔离级别，下表列出了这4种隔离级别及其使用时间。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table style="width: 512px; height: 103px" border="1" cellspacing="1" cellpadding="1" width="512" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;隔离级别&lt;/td&gt;&#xD;
&lt;td&gt;读&lt;/td&gt;&#xD;
&lt;td&gt;更新&lt;/td&gt;&#xD;
&lt;td&gt;插入&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;读未提交的&lt;/td&gt;&#xD;
&lt;td&gt;读取未提交的数据&lt;/td&gt;&#xD;
&lt;td&gt;允许&lt;/td&gt;&#xD;
&lt;td&gt;允许&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;读已提交的（默认）&lt;/td&gt;&#xD;
&lt;td&gt;读取已提交的数据&lt;/td&gt;&#xD;
&lt;td&gt;允许&lt;/td&gt;&#xD;
&lt;td&gt;允许&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;重复读&lt;/td&gt;&#xD;
&lt;td&gt;读取已提交的数据&lt;/td&gt;&#xD;
&lt;td&gt;不允许&lt;/td&gt;&#xD;
&lt;td&gt;允许&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;序列化&lt;/td&gt;&#xD;
&lt;td&gt;读取已提交的数据&lt;/td&gt;&#xD;
&lt;td&gt;不允许&lt;/td&gt;&#xD;
&lt;td&gt;不允许&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;隔离级别是关系数据库的一个功能，也就是说，它基本上只与SQL Server相关，而与ADO.NET，EF或LINQ是没有什么关系的，但你可以在这些组件上设置隔离级别。&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/d244e20be7a00c58.jpg" href="/picshow/index288760.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;图 10 隔离级别&lt;/p&gt;&#xD;
&lt;p&gt;中间层：在中间层，你可以使用事务范围对象指定隔离级别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;TransactionOptions TransOpt &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;&lt;span style="color: #000000"&gt; TransactionOptions();&lt;br /&gt;TransOpt.IsolationLevel &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; System.Transactions.IsolationLevel.ReadCommitted; &lt;br /&gt;using(TransactionScope scope &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;TransactionScope(TransactionScopeOption.Required, TransOptions))&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ADO.NET：在ADO.NET中你可以使用SqlTransaction对象指定事务隔离级别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;SqlTransaction objtransaction &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;br /&gt;objConnection.BeginTransaction(System.Data.IsolationLevel.Serializable);&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SQL Server：你也可以在TSQL中使用&amp;#8220;SET TRANSACATION ISOLATION LEVEL&amp;#8221;指定隔离级别。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;SET&lt;/span&gt;&lt;span style="color: #000000"&gt; TRANSACTION ISOLATION LEVEL READ COMMITTED;&lt;/span&gt;&lt;/div&gt;&lt;/div&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;table style="width: 514px; height: 103px" border="1" cellspacing="1" cellpadding="1" width="514" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&#xD;
&lt;td&gt;读已提交的&lt;/td&gt;&#xD;
&lt;td&gt;重复读&lt;/td&gt;&#xD;
&lt;td&gt;序列化&lt;/td&gt;&#xD;
&lt;td&gt;读未提交的&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;脏读取&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;丢失更新&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;非重复读&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;幻想行&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&#xD;
&lt;td&gt;能解决&lt;/td&gt;&#xD;
&lt;td&gt;不能&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　解决方案4：使用&amp;#8220;读已提交的&amp;#8221;解决&amp;#8220;脏读取&amp;#8221;问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于&amp;#8220;读已提交的&amp;#8221;的一些关键点：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 它是SQL Server默认的事务隔离级别。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 它只读取已提交的数据，换句话说就是，任何未提交的数据它都会置之不理，直到数据提交为止，下图对其进行了详细解释，你也可以看到更新。&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/1937d6b10c19047b.jpg" width="533" height="284" href="/picshow/index288780.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 11 读已提交模式解析&lt;/p&gt;&#xD;
&lt;p&gt;如果你想看到上图所述的情况，只需要按照下面的步骤做就可以了：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 打开两个查询窗口，执行一个更新事务，但不提交;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 在第二个窗口中执行查询时，会显示如下图所示的查询被阻止的提示。&lt;/p&gt;&#xD;
&lt;p style="text-align: center"&gt;&lt;img style="cursor: hand" border="1" alt="1" src="http://image20.it168.com/201010_0x0/289/22ca251fb61e4166.jpg" href="/picshow/index288781.shtml" /&gt;&lt;br /&gt;&lt;br /&gt;　　图 12 查询被阻止，直到更新事务提交后才能执行&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;#8220;读已提交的&amp;#8221;对立面是&amp;#8220;读未提交的&amp;#8221;吗?&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;是的，读未提交的是读已提交的对立面，当你设置读未提交的事务隔离级别时，未提交的数据也被读取了。&lt;/p&gt;&#xD;
&lt;p&gt;关于&amp;#8220;读已提交的&amp;#8221;关键点：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 未提交的是可见的，因此脏读取是可能的;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 没有锁被抓住;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; &amp;nbsp;当锁不重要时很有用，更重要的是并发性和吞吐量。&lt;/p&gt;&#xD;
&lt;p&gt;如果你也想测试一下，试试下面的SQL语句，它执行一个更新然，在等待20秒后回滚，在此期间如果你执行查询，返回的是未提交的数据，但20秒后，你再查询，返回的将会以前的旧数据，因为提交的数据已回滚。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; transaction isolation level read uncommitted&lt;br /&gt;Begin Tran&lt;br /&gt;&lt;br /&gt;Update customer &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; CustomerName&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;Changed' where CustomerCode='1001'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;WAITFOR DELAY &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;000:00:20'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;rollback tran&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; transaction isolation level read uncommitted&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; from Customer where CustomerCode&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;1001'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　解决方案5：使用重复读解决丢失更新和非重复读&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;给重复读设置隔离级别后，其他人就不能读取和更新数据，关于重复读隔离级别的关键点包含：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 当为查询设置重复事务隔离级别时，只读取已提交的数据。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 当你使用重复读选择一条记录时，其它事务将不能更新该条记录，但查询是可以的。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 如果在更新查询中设置了可重复事务，必须要等到事务完成才能读和更新相同的记录。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; &amp;nbsp;当选择和更新查询被设置为可重复读，其它事务可以插入新记录，换句话说就是虚幻行是可能的。&lt;/p&gt;&#xD;
&lt;p&gt;如果你想测试这个隔离级别，执行下面的语句，然后尝试查询和更新查询，它们都将被阻止，50秒后你才能看到数据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; transaction isolation level repeatable read&lt;br /&gt;Begin Tran&lt;br /&gt;Update customer &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; CustomerName&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;Changed' where CustomerCode='1001'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;WAITFOR DELAY &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;000:00:50'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;rollback tran&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果在重复读模式下执行下面的查询语句，在50秒内你啥也干不了，直到事务完成后你才能得到查询结果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; padding-bottom: 4px; padding-left: 5.4pt; width: 98%; padding-right: 5.4pt;background: #e6e6e6; word-break: break-all; border-top: windowtext 0.5pt solid; border-right: windowtext 0.5pt solid; padding-top: 4px" id="div_code"&gt;&#xD;
&lt;style type="text/css"&gt;#div_code img{border:0px;}&lt;/style&gt;&#xD;
&#xD;
&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt; transaction isolation level repeatable read&lt;br /&gt;begin tran&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;select&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt; from Customer where CustomerCode&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;1001'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;WAITFOR DELAY &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt;000:00:50'&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;commit tran&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意，在此期间你可以添加CustomerCode=&amp;#8217;1001&amp;#8217;的新记录，换句话说就是虚幻行是可能的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　解决方案6：使用序列化隔离级别解决虚幻行问题&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这是最高级的隔离级别，在此期间，其它事务是不能更新，查询和插入记录的，关于序列化事务的一些关键点包含：&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 当隔离级别是序列化时，没有其它事务可以插入，更新，删除或查询。&lt;/p&gt;&#xD;
&lt;p&gt;&amp;#8226; 会出现许多阻塞，但所有并发性问题都能得到解决。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2321904.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2012/01/13/2321904.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/07/19/2110880.html</id><title type="text">正则表达式资源</title><summary type="text">http://www.regexlib.com/通过这个网站可以找到很多已有的正则表达式的例子.当用户登录网站时，一般要求用户提供登录该网站的用户名称和密码。从某种意义上说，密码的复杂程度越高，用户的信息安全性越高。因此，很多网站在注册用户信息或修改用户密码时，往往会提供一个密码强度的说明，从而提醒用户使用高强度的密码。 目前来说，密码字符可以分为3种：数字、字母和特殊字符（即除数字、字母之外的字符）。用户密码包含上述3种字符种的种类越多，密码的安全性越高。用户密码只含其中一种的安全性是最低的，如123455、abcdef等。其次是含上述2种字符的密码，如123abc、123!@#等。密码强度</summary><published>2011-07-19T09:45:00Z</published><updated>2011-07-19T09:45:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/07/19/2110880.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/07/19/2110880.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.regexlib.com/"&gt;http://www.regexlib.com/&lt;/a&gt;&amp;nbsp;通过这个网站可以找到很多已有的正则表达式的例子.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当用户登录网站时，一般要求用户提供登录该网站的用户名称和密码。从某种意义上说，密码的复杂程度越高，用户的信息安全性越高。因此，很多网站在注册用户信息或修改用户密码时，往往会提供一个密码强度的说明，从而提醒用户使用高强度的密码。 &lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;目前来说，密码字符可以分为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span&gt;种：数字、字母和特殊字符（即除数字、字母之外的字符）。用户密码包含上述&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span&gt;种字符种的种类越多，密码的安全性越高。用户密码只含其中一种的安全性是最低的，如&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;123455&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;abcdef&lt;/font&gt;&lt;/span&gt;&lt;span&gt;等。其次是含上述&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;2&lt;/font&gt;&lt;/span&gt;&lt;span&gt;种字符的密码，如&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;123abc&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;123!@#&lt;/font&gt;&lt;/span&gt;&lt;span&gt;等。密码强度最好的是：包含上述&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;3&lt;/font&gt;&lt;/span&gt;&lt;span&gt;种字符，如&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;123QAZ!@#&lt;/font&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 26.25pt; margin: 0cm 0cm 0pt"&gt;&lt;span&gt;注意：本小节中的特殊字符包括&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;`&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;-&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;=&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;,&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;.&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;/&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;~&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;!&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;@&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;#&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;$&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;%&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;^&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;&amp;amp;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;*&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;)&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;_&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;|&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;?&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;&amp;lt;&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;:&lt;/font&gt;&lt;/span&gt;&lt;span&gt;、&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;span&gt;字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;　　1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．只包含数字的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码中只包含数字，那么该密码是非常简单。当然，它的安全性也相对较差。以下正则表达式能够验证只包含数字的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;\d+&lt;span&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;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;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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&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;/span&gt;&lt;span&gt;68&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;该类型密码的安全性随着密码的长度增加而增加。密码长度越大，它的安全性越高。以下正则表达式能够验证长度至少为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、只包含数字的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;\d{6,}&lt;span&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;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;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;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;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;/span&gt;&lt;span&gt;69&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;　　2&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．只包含字母的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码中只包含字母，那么该密码是非常简单。当然，它的安全性也相对较差。以下正则表达式能够验证只包含字母的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[a-zA-Z]+&lt;span&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;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;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;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;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;70&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;该类型密码的安全性随着密码的长度增加而增加。密码长度越大，它的安全性越高。以下正则表达式能够验证长度至少为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、只包含字母的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[a-zA-Z]{6,}&lt;span&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;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;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;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;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;71&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;　　3&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．只包含特殊字符的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码中只包含特殊字符，那么该密码是非常简单。当然，它的安全性也相对较差。以下正则表达式能够验证只包含特殊字符的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&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;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;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;72&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;72&lt;/font&gt;&lt;/span&gt;&lt;span&gt;）解释：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span&gt;q&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span&gt;q&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span&gt;q&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span&gt;q&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;其他的每一个字符就表示字符本身。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　该类型密码的安全性随着密码的长度增加而增加。密码长度越大，它的安全性越高。以下正则表达式能够验证长度至少为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、只包含特殊字符的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]&lt;/span&gt;&lt;span&gt;{6,}&lt;span&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;73&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　使用工具&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;Regex Tester&lt;/font&gt;&lt;/span&gt;&lt;span&gt;测试正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;73&lt;/font&gt;&lt;/span&gt;&lt;span&gt;），结果如图&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;4.34&lt;/font&gt;&lt;/span&gt;&lt;span&gt;所示。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;/p&gt;&lt;span&gt;&#xD;
&lt;div align="center" forimg="1"&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt" align="center"&gt;&lt;img title="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" alt="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wlzhengzebiaodashi/4.4.5.jpg" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://blog.csdn.net/wlzhengzebiaodashi/archive/2008/03/24/2211800.aspx"&gt;&lt;font color="#336699"&gt;4.4.5 密码验证（2）&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;　　4&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．当且仅当含数字和字母的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码当且仅当包含数字和字母，那么该密码的强度是中等强度。当然，它的安全性一般。以下正则表达式能够验证当且仅当包含数字和字母的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[\da-zA-Z]*\d+[a-zA-Z]+[\da-zA-Z]*&lt;span&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;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;74&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;74&lt;/font&gt;&lt;/span&gt;&lt;span&gt;）解释：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配长度至少&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由数字组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[a-zA-Z]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配长度至少&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由字母组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[\da-zA-Z]*&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配空字符串，或者长度至少&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由数字或字母组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d+[a-zA-Z]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;保证密码既包含了数字又包含特殊字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　使用工具&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;Regex Tester&lt;/font&gt;&lt;/span&gt;&lt;span&gt;测试正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;74&lt;/font&gt;&lt;/span&gt;&lt;span&gt;），结果如图&lt;/span&gt;&lt;span&gt;所示。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;span&gt;&lt;img title="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" alt="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wlzhengzebiaodashi/4.4.5.1.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 6pt 0cm 0pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;div align="center" forimg="1"&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;　　5&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．当且仅当含数字和特殊字符的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码当且仅当包含数字和特殊字符，那么该密码的强度是中等强度。当然，它的安全性一般。以下正则表达式能够验证当且仅当包含数字和特殊字符的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[-\d&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]*\d+[-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+[-\d&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]*&lt;span&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&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;/span&gt;&lt;span&gt;75&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;75&lt;/font&gt;&lt;/span&gt;&lt;span&gt;）解释：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;字符类&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-\d`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示任意数字；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；其他的每一个字符就表示字符本身。该字符类可以匹配数字或者特殊字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由数字组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由特殊字符组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d+[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;保证密码既包含了数字又包含特殊字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　使用工具&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;Regex Tester&lt;/font&gt;&lt;/span&gt;&lt;span&gt;测试正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;75&lt;/font&gt;&lt;/span&gt;&lt;span&gt;），结果如图&lt;/span&gt;&lt;span&gt;所示。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;/p&gt;&lt;span&gt;&#xD;
&lt;div align="center" forimg="1"&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt" align="center"&gt;&lt;span&gt;&lt;img title="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" alt="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wlzhengzebiaodashi/4.4.5.2.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 6pt 0cm 0pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt" align="center" forimg="1"&gt;&lt;/p&gt;&#xD;
&lt;div align="left" forimg="1"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;6&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．当且仅当包含字母和特殊字符的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码当且仅当包含字母和特殊字符，那么该密码的强度是中等强度。当然，它的安全性一般。以下正则表达式能够验证只包含字母和特殊字符的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[-a-zA-Z&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]*[a-zA-Z]+[-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+[-a-zA-Z&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]*&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;76&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;76&lt;/font&gt;&lt;/span&gt;&lt;span&gt;）解释：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;字符类&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-a-zA-Z`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;a-z&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示小写字母；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;A-Z&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示大写字母；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；其他的每一个字符就表示字符本身。该字符类可以匹配字母或者特殊字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[a-zA-Z]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由字母组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由特殊字符组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[a-zA-Z]+[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;保证密码既包含了字母又包含特殊字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　使用工具&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;Regex Tester&lt;/font&gt;&lt;/span&gt;&lt;span&gt;测试正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;76&lt;/font&gt;&lt;/span&gt;&lt;span&gt;），结果如图&lt;/span&gt;&lt;span&gt;所示。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;span&gt;&lt;img title="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" alt="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wlzhengzebiaodashi/4.4.5.3.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 6pt 0cm 0pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt" align="center"&gt;&lt;/p&gt;&#xD;
&lt;div align="center" forimg="1"&gt;&lt;/div&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 3pt 0cm"&gt;&lt;strong&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;　　7&lt;/font&gt;&lt;/span&gt;&lt;span&gt;．当且仅当包含数字、字母和特殊字符的密码验证&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　如果密码当且仅当包含数字、字母和特殊字符，那么该密码的强度是高强度。当然，它的安全性相对比较好。以下正则表达式能够验证当且仅当包含数字、字母和特殊字符的密码。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[-\da-zA-Z&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]*&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;span&gt;&lt;font style="background-color: rgb(224,224,224)" size="2"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;(\d+[a-zA-Z]+[-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+)&lt;span&gt; &lt;/span&gt;#&lt;/span&gt;&lt;span&gt;数字开头&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;|(\d+[-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+[a-zA-Z]+) #&lt;/span&gt;&lt;span&gt;数字开头&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;|([a-zA-Z]+\d+[-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+) #&lt;/span&gt;&lt;span&gt;字母开头&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;|([a-zA-Z]+[-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+\d+) #&lt;/span&gt;&lt;span&gt;字母开头&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;|([-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+\d+[a-zA-Z]+) #&lt;/span&gt;&lt;span&gt;特殊字符开头&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;|([-&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]+[a-zA-Z]+\d+) #&lt;/span&gt;&lt;span&gt;特殊字符开头&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;span&gt;&lt;font style="background-color: rgb(224,224,224)" size="2"&gt;)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;font size="2"&gt;&lt;font style="background-color: rgb(224,224,224)"&gt;&lt;span&gt;[-\da-zA-Z&lt;/span&gt;&lt;span&gt;`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?&lt;/span&gt;&lt;span&gt;]*&lt;span&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;77&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;77&lt;/font&gt;&lt;/span&gt;&lt;span&gt;）解释：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由数字组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[a-zA-Z]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由字母组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配最小长度为&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span&gt;的、由特殊字符组成的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d+[a-zA-Z]+[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配型如&amp;#8220;数字＋字母＋特殊字符&amp;#8221;类型的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;(\d+[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+[a-zA-Z]+)&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配型如&amp;#8220;数字＋特殊字符＋字母&amp;#8221;类型的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[a-zA-Z]+\d+[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配型如&amp;#8220;字母＋数字＋特殊字符&amp;#8221;类型的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[a-zA-Z]+[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+\d+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配型如&amp;#8220;字母＋特殊字符＋数字&amp;#8221;类型的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+\d+[a-zA-Z]+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配型如&amp;#8220;特殊字符＋数字＋字母&amp;#8221;类型的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]+[a-zA-Z]+\d+&lt;/font&gt;&lt;/span&gt;&lt;span&gt;匹配型如&amp;#8220;特殊字符＋字母＋数字&amp;#8221;类型的字符串。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 39.1pt"&gt;&lt;span style="font: 7pt Times New Roman; font-size-adjust: none; font-stretch: normal"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;字符类&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[-\da-zA-Z`=\\\[\];',./~!@#$%^&amp;amp;*()_+|{}:"&amp;lt;&amp;gt;?]*&lt;/font&gt;&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\d&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示任意数字；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;a-z&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示小写字母；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;A-Z&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示大写字母；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;[&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;\]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;表示字符&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;]&lt;/font&gt;&lt;/span&gt;&lt;span&gt;；其他的每一个字符就表示字符本身。该字符类可以匹配数字、字母或者特殊字符。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt"&gt;&lt;span&gt;　　使用工具&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;Regex Tester&lt;/font&gt;&lt;/span&gt;&lt;span&gt;测试正则表达式（&lt;/span&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;77&lt;/font&gt;&lt;/span&gt;&lt;span&gt;），结果如图&lt;/span&gt;&lt;span&gt;所示。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt" align="center"&gt;&lt;/p&gt;&lt;span&gt;&#xD;
&lt;p style="margin: 3pt 0cm 6pt" align="center"&gt;&lt;span&gt;&lt;img title="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" alt="密码验证,密码强度正则表达式  - 剑血 - 碎片记忆" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wlzhengzebiaodashi/4.4.5.4.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2110880.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/07/19/2110880.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051698.html</id><title type="text">NDoc 用户指南(转)</title><summary type="text">欢迎使用 NDoc What&amp;#39;s New?已知问题 快速教程 配置您的 C# 项目 “装饰”您的代码 NDoc 支持的标记 NDoc 支持的属性 (Attribute) 新建 NDoc 项目 NDoc 设计器 选项 NDoc 命令行工具 使用 NDoc 命令行自动生成代码文档 NDoc 文档引擎 VS.NET 文档引擎 指向其他文档集合的 XLinks 与 Visual Studio .NET IDE 的集成Microsoft Help 2 部署 MSDN 文档引擎 MSDN 2003 文档引擎XML 文档引擎JavaDoc 文档引擎Linear HTML 文档引擎LaTeX 文档引擎</summary><published>2011-05-20T01:56:00Z</published><updated>2011-05-20T01:56:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051698.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051698.html"/><content type="html">&lt;table style="width: 1439px; height: 41029px" border="0" width="1439" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td height="20" colspan="2"&gt;&#xD;
&lt;div align="center"&gt;&#xD;
&lt;p &gt;&lt;/p&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr valign="top"&gt;&#xD;
&lt;td colspan="2"&gt;&#xD;
&lt;table style="width: 1443px; height: 38799px" border="0" width="1443" align="center"&gt;&lt;!--DWLayoutTable--&gt;&#xD;
&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  valign="top"&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#1"&gt;欢迎使用 NDoc &lt;/a&gt;&lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#11"&gt;What's New?&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#12"&gt;已知问题&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#2"&gt;快速教程&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#21"&gt;配置您的 C# 项目&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#22"&gt;&amp;#8220;装饰&amp;#8221;您的代码&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#211"&gt;NDoc 支持的标记&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#212"&gt;NDoc 支持的属性 (Attribute) &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#23"&gt;新建 NDoc 项目 &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#4"&gt;NDoc 设计器&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#41"&gt;选项 &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#5"&gt;NDoc 命令行工具 &lt;/a&gt;&lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#51"&gt;使用 NDoc 命令行自动生成代码文档 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#6"&gt;NDoc 文档引擎&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#61"&gt;VS.NET 文档引擎&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#611"&gt;指向其他文档集合的 XLinks &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#612"&gt;与 Visual Studio .NET IDE 的集成&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#613"&gt;Microsoft Help 2 部署&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#71"&gt;MSDN 文档引擎 &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#81"&gt;MSDN 2003 文档引擎&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#91"&gt;XML 文档引擎&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#101"&gt;JavaDoc 文档引擎&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#111"&gt;Linear HTML 文档引擎&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#121"&gt;LaTeX 文档引擎&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#7"&gt;NDoc 支持的标记&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#711"&gt;标记用法&lt;/a&gt; &lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#712"&gt;&amp;lt;c&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#713"&gt;&amp;lt;code&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#714"&gt;&amp;lt;event&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#715"&gt;&amp;lt;example&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#716"&gt;&amp;lt;exception&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#717"&gt;&amp;lt;exclude&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#718"&gt;&amp;lt;include&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#719"&gt;&amp;lt;list&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#720"&gt;&amp;lt;note&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#721"&gt;&amp;lt;overloads&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#722"&gt;&amp;lt;para&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#723"&gt;&amp;lt;param&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#724"&gt;&amp;lt;paramref&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#725"&gt;&amp;lt;permission&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#726"&gt;&amp;lt;preliminary&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#727"&gt;&amp;lt;remarks&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#728"&gt;&amp;lt;returns&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#729"&gt;&amp;lt;see&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#730"&gt;&amp;lt;seealso&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#731"&gt;&amp;lt;summary&amp;gt;&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#732"&gt;&amp;lt;threadsafety&amp;gt; &lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#733"&gt;&amp;lt;value&amp;gt;&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#8"&gt;定义您自己的标记&lt;/a&gt; &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#811"&gt;可用 Section 的列表&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#9"&gt;NDoc 开发者参考 &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#10"&gt;加入 NDoc 开发&lt;/a&gt;&lt;/li&gt;&lt;li &gt;&lt;a href="http://www.uml.org.cn/net/200702271.asp#11"&gt;支持资源&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;&lt;a name="1"&gt;&lt;/a&gt;关于 NDoc&lt;/strong&gt;&lt;br /&gt;　NDoc 可以将 C#.NET 编译生成的程序集和对应的 /doc XML 文档，自动转换成如 .NET Framework SDK 类库文档或者 MSDN Library 在线 .NET 类库文档形式的代码文档，让您快速拥有专业级的类库API 文档。(VB.NET 通过第三方插件如 VBCommenter 的支持，也可以生成 XML 文档。) &lt;br /&gt;&lt;br /&gt;　NDoc 代码文档的样式包括 HTML Help 1 (即 *.CHM 格式)，Microsoft Help 2 (即以形如 ms-help://... 的 URI 地址访问的文档)，以及 MSDN 在线网页样式的 .NET Framework 类库文档。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 为开放源代码项目，采用 GNU General Public Licence 授权协议（除非您的软件/项目也采用 GPL 协议开放源代码，否则您不能在您的软件/项目中使用 NDoc 源代码中的任何部分）。更多的授权问题，请参见 GNU FAQ。&lt;/p&gt;&#xD;
&lt;p &gt;感谢您使用我们的软件，也期待着您的参与（建议、BUG 反馈、代码贡献）！&lt;/p&gt;&#xD;
&lt;p &gt;使用 NDoc 之前&lt;br /&gt;请阅读 GNU General Public Licence 和 GNU FAQ。&lt;/p&gt;&#xD;
&lt;p &gt;请阅读 已知问题。&lt;/p&gt;&#xD;
&lt;p &gt;请阅读 必要的帮助文件编译器。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 各本地化版本&lt;br /&gt;　英文版: NDoc in English &lt;br /&gt;　简体中文版: NDoc in Simplified Chinese &lt;br /&gt;　德文版: NDoc in German &lt;br /&gt;　日文版: NDoc in Japanese &lt;br /&gt;　(此列表可能并不完整。欢迎大家给我发送更多关于 NDoc 的本地化版本的网址！)&lt;/p&gt;&#xD;
&lt;p &gt;关于中文版&lt;br /&gt;　此 NDoc 1.3 (中文版) 由 破宝(percyboy) 翻译，遵循 GPL 协议的要求发布源代码。有关中文版的翻译问题和 bug 等，都可以通过我的博客和我联系。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;&lt;a name="11"&gt;&lt;/a&gt;NDoc 1.3 - What's new?&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 包含了大量更新和改进，也修复了许多 bug。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;亮点&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 包含了许多新功能: &lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;完全重写了 Microsoft Help 2 文档引擎，即 "VS.NET 2003 文档引擎"。&lt;/li&gt;&lt;li &gt;支持更多新的注释标记，如 preliminary, threadsafety 和 exclude。&lt;/li&gt;&lt;li &gt;支持 ObsoleteAttribute 和 FlagsAttribute 属性。&lt;/li&gt;&lt;li &gt;NDoc 1.3 改进了可扩展性，允许您定义自己的注释标记，并控制它们的显示样式。&lt;/li&gt;&lt;li &gt;用户界面更加友好。&lt;/li&gt;&lt;li &gt;程序集的解析及文档制作过程，在性能上有了大的提高。&lt;/li&gt;&lt;li &gt;与 MSDN 各帮助主题更好的共存。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;VS.NET 2003 文档引擎&lt;/strong&gt;&lt;br /&gt;　新的 VS.NET 2003 文档引擎用于制作 Microsoft Help 2 形式的文档，完全按照 Microsoft 的说明，在每页头部都加入了特定的 XML 数据岛，从而和 Visual Studio .NET 2003 合并文档集合更好的兼容，和 Visual Studio .NET IDE 更好的集成(比如更好的支持&amp;#8220;动态帮助&amp;#8221;功能等)。&lt;/p&gt;&#xD;
&lt;p &gt;新的文档引擎可以制作出和最新 Microsoft 文档格式更为接近的文档，比如新增的语言筛选器等功能。&lt;/p&gt;&#xD;
&lt;p &gt;更多的细节请参看 VS.NET 2003 文档引擎。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;性能&lt;/strong&gt;&lt;br /&gt;　所有文档引擎的性能都有很大程度的提高。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;NDoc 中间 XML 数据文件的制作过程有了相当的提速，现在这个过程在整个文档生成过程中所占的时间比例已经很小了。&lt;/li&gt;&lt;li &gt;页面制作的时间也减少了 20% ~ 50%。&lt;/li&gt;&lt;li &gt;内存占用显著降低了。&lt;/li&gt;&lt;li &gt;命名空间层次结构页面的制作过程，得到了改进，不再担心性能或稳定性问题了。因此，文档引擎总是制作命名空间层次结构页。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;程序集加载&lt;/strong&gt;&lt;br /&gt;　程序集的加载方法有了不少改进。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;程序集改变时，GUI 程序不需要重新启动就能反映更新。&lt;/li&gt;&lt;li &gt;大多数程序集可以从网络共享地址加载。但是，因为 .NET Framework 的安全限制，由托管 C++ 生成的程序集必须在本地磁盘中，不能从网络共享地址中正常加载。&lt;/li&gt;&lt;li &gt;程序集的解析得到了改进，现在已经极少出错了。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;strong&gt;国际化&lt;/strong&gt;&lt;br /&gt;　NDoc 现在可以正常处理程序集及代码注释中包含的非英文字符。除 MSDN 文档引擎(HTML Help 1 格式)之外，其他文档引擎都完全支持 Unicode (UTF-8)字符。受 HTML Help 1 的局限，MSDN 文档引擎不支持混合字符集，这是我们所无法控制的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;注意，尽管 NDoc 支持多种字符集，但 NDoc 生成的代码文档的各个标题、及 NDoc 的界面、提示消息等文本，在 NDoc 1.3 中还未实现多语言显示。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;NDoc 并行运行能力&lt;/strong&gt;&lt;br /&gt;　多个 NDoc 实例现在可以同时并行运行。先前的文件锁定等问题已经得到解决。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;用户界面&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;对拖放操作的支持。新版本中，您可以直接将程序集从资源管理器中拖曳到 NDoc GUI 的程序集列表中。&lt;/li&gt;&lt;li &gt;错误处理。新版本的错误处理得到了显著的改进。&lt;/li&gt;&lt;li &gt;帮助编译器消息。帮助编译器的消息被记入 log。如果出错，错误消息被显示出来。&lt;/li&gt;&lt;li &gt;属性网格。属性网格有了不少加强。&lt;/li&gt;&lt;li &gt;能处理程序集加载错误。&lt;/li&gt;&lt;li &gt;对没有 XML 文档的程序集，也能为输出简单的代码文档。&lt;/li&gt;&lt;li &gt;对相对路径的支持。一般都是相对于 NDoc 项目文件。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;XML 文档标记&lt;/strong&gt;&lt;br /&gt;　&lt;strong&gt;新标记&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;标记&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;exclude/&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;Directs NDoc to exclude the tagged type or member from the documentation.&lt;br /&gt;The tag overrides all visibility options. &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;preliminary&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;Marks the documentation of a type or member as preliminary. &lt;br /&gt;This tag can include text and block tags like &amp;lt;para&amp;gt; in order to put a custom warning into your help topics about preliminary items. &lt;br /&gt;If the tag is empty, preliminary topics will include the default message: &lt;br /&gt;[This is preliminary documentation and subject to change.] &lt;br /&gt;It is also possible to mark an entire help project as preliminary using the Preliminary project setting. &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;devdoc&amp;gt;&lt;/td&gt;&#xD;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;增强的标记&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;&lt;strong&gt;标记&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;code&amp;gt;&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;ul&gt;&lt;li &gt;"lang" attribute&lt;/li&gt;&lt;li &gt;No more &amp;lt;include&amp;gt; to prevent indent&lt;/li&gt;&lt;li &gt;"Escaped" attribute &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;see&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;langword&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;　新配置项&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 加入了下面的通用配置项:&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#999999"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;配置项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;文档主要配置&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;CleanIntermediates&lt;/td&gt;&#xD;
&lt;td &gt;是否在文档成功生成后，删除中间文件。 &lt;br /&gt;比如 MSDN 和 VS.NET 文档引擎会编译为单一文件，它们的中间文件包括所有编译前的网页、HTML Help 项目文件等。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;FeedbackEmailAddress&lt;/td&gt;&#xD;
&lt;td &gt;用户反馈接收 Email 地址。将在输出的代码文档每页的底部添加放置指向此 Email 地址的超链接。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Preliminary&lt;/td&gt;&#xD;
&lt;td &gt;若此项为真，文档引擎将在每个页面中添加红色的消息&amp;#8220;[此文档为预发布版本，在未来版本中有可能改变。]&amp;#8221;。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SdkDocVersion&lt;/td&gt;&#xD;
&lt;td &gt;指示文档引擎应将 .NET Framework 标准类库中包含的类型的超链接指向哪个版本的 .NET Framework SDK。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SdkDocLanguage&lt;/td&gt;&#xD;
&lt;td &gt;指示文档引擎应将 .NET Framework 标准类库中包含的类型的超链接指向哪种本地化语言版本的 .NET Framework SDK。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;属性(attribute)的输出&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentInheritedAttributes&lt;/td&gt;&#xD;
&lt;td &gt;是否输出从基类中继承而来的属性(attribute)。如果 DocumentAttributes = false，则此配置被忽略。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;输出过滤&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentedInheritedMembers&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;如何输出继承的成员：可选择不输出、只输出继承的实例成员或者是全部继承成员都输出。 &lt;br /&gt;它有三个选项:&lt;br /&gt;&lt;/span&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;None&lt;/td&gt;&#xD;
&lt;td &gt;不输出继承的成员。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Instance&lt;/td&gt;&#xD;
&lt;td &gt;只输出继承的实例成员。(默认选项)&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;InstanceAndStatic&lt;/td&gt;&#xD;
&lt;td &gt;输出全部继承的实例和静态成员。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentInheritedFrameworkMembers&lt;/td&gt;&#xD;
&lt;td &gt;是否输出从 .NET Framework 中的类、结构等继承下来的成员。(默认为输出) &lt;br /&gt;注意: 如果 DocumentInheritedMembers 为 None, 此配置被忽略。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentExplicitInterfaceImplementations&lt;/td&gt;&#xD;
&lt;td &gt;是否输出显式实现的接口成员。(默认为否)&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentSealedProtected&lt;/td&gt;&#xD;
&lt;td &gt;是否输出密封类 (sealed, VB.NET 中为 NotInheritable) 的 protected 成员。(默认为否) &lt;br /&gt;注意: 如果 DocumentProtected 为 false，则忽略此项配置。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SkipNamespacesWithoutSummaries&lt;/td&gt;&#xD;
&lt;td &gt;是否跳过缺少概述信息的命名空间。(默认为否)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;删除的配置项&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 删除了下面的配置项:&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;&lt;strong&gt;配置项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;GetExternalSumeries&lt;/td&gt;&#xD;
&lt;td &gt;NDoc 中间 XML 数据文件制作的性能有了相当的改进。因此，总是尝试为从 .NET Framework 继承而来的成员查找摘要信息。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;IncludeNamespaceHierarchy&lt;/td&gt;&#xD;
&lt;td &gt;命名空间层次结构页面的制作过程，得到了改进，不再担心性能或稳定性问题了。因此，文档引擎总是制作命名空间层次结构页。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;MSDN 文档引擎&lt;/strong&gt;&lt;br /&gt;　&lt;strong&gt;新配置项&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 为 MSDN 文档引擎加入了下面的配置项:&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#999999"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;配置项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;文档主要配置&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;BinaryToc&lt;/td&gt;&#xD;
&lt;td &gt;是否以二进制方式创建目录树文件。这将显著提高大尺寸 CHM 文件的打开速度。 &lt;br /&gt;默认此项被设置为 true。但启用此配置项，有一些强制的限制必须满足。如果您遇到问题，可以尝试关闭此功能。更多细节请查看 HTML Help Workshop 的文档。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Title&lt;/td&gt;&#xD;
&lt;td &gt;此文本将显示在每个页面的左上角，一般填写类库的名称比较合适。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;扩展性&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ExtensibilityStylesheet&lt;/td&gt;&#xD;
&lt;td &gt;用户自定义的 NDoc 扩展 XSLT 转换文件，用于转换用户自定义的特殊标记。请参见 NDoc 可扩展性。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;HTML Help 选项&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AdditionalContentResourceDirectory&lt;/td&gt;&#xD;
&lt;td &gt;页面中涉及到的资源文件（如图片等）所在的目录。此目录及其子目录中的所有文件，将以原有的目录结构包含进 HTML Help 项目中，使用相对路径的超链接不需要做大的调整。 &lt;br /&gt;注意: 此文件夹中第一层次的文件，和 NDoc 生成的 HTML 文件、以及通过 FilesToInclude 包含进来的文件，将处在同一层次上，请依次类推其他文件的相对 URL。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;LangID&lt;/td&gt;&#xD;
&lt;td &gt;HTML Help 文件的 LangID 设置。中文版默认为 2052。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;删除的配置项&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 删除了下面的配置项:&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;配置项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SortTOCByNamespace&lt;/td&gt;&#xD;
&lt;td &gt;在 NDoc 1.3 中，各命名空间对应的目录结点总是按字母排序。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SplitTOCs&lt;/td&gt;&#xD;
&lt;td &gt;在老的 MSDN 文档引擎中，此配置项用于克服一些限制。新版本中绕开了它。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DefaultTOC&lt;/td&gt;&#xD;
&lt;td &gt;CHM 目录中第一个命名空间结点总是被默认被选中。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;LinkToSdkDocVersion&lt;/td&gt;&#xD;
&lt;td &gt;此配置项现在区分为 SdkDocVersion 和 SdkDocLanguage，且提升为所有文档引擎的通用配置项。&lt;br /&gt;NDoc 1.3 仍然会尝试解析此配置，如果您重新保存，NDoc GUI 会用新的配置项改写。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;改进的超链接逻辑&lt;/strong&gt;&lt;br /&gt;　&amp;lt;see&amp;gt; 将形成一个指向另一个类型/成员的文档的链接。在 NDoc 1.3 中，如果一个 HTML 页中出现了多个指向同一个类型/成员的文档的 &amp;lt;see&amp;gt;，则只转换第一个为超链接，其余的不表示为超链接、只显示为粗体。这将使页面不至于太杂乱。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;HTML Help 1 目录树中的图标&lt;/strong&gt;&lt;br /&gt;　目录树中，不再出现问号(?)图标。如果没有指定，显示为空白页图标。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;运算符和类型转换&lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 修复了对运算符和类型转换的处理 bug，页面格式也更接近 .NET Framework SDK 类库文档。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;特别的属性&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;　ObsoleteAttribute&lt;/strong&gt;&lt;br /&gt;　MSDN, MSDN 2003, VS.NET 2003 文档引擎，将自动为具有 ObsoleteAttribute 属性的类型/成员添加红色的提示文本。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;在命名空间列表及类型的成员列表中，将为它们显示红色的&amp;#8220;已过时。&amp;#8221;&lt;/li&gt;&lt;li &gt;在类型概述页/成员页中，将为它们添加红色的&amp;#8220;注意：此成员现已过时。&amp;#8221; &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;FlagsAttribute&lt;/strong&gt;&lt;br /&gt;　如果枚举具有 FlagsAttribute 属性，MSDN, MSDN 2003, VS.NET 2003 文档引擎将自动为它们添加如下的文本:&lt;/p&gt;&#xD;
&lt;p &gt;&amp;#8220;此枚举具有允许按位组合其成员值的 FlagsAttribute 属性。&amp;#8221; &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;&lt;a name="12"&gt;&lt;/a&gt;NDoc 1.3 的已知问题和限制 &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="92%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;事项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;特别长的类型名称&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;NDoc 为每一个主题自动在硬盘上创建一个 HTML 文件。目前，文件名是根据完全限定名生成的。如果某类型/成员的完全限定名 (命名空间 + 类型 + 成员名) 的总字符数超过 _MAX_FNAME (256 字符)，NDoc 将无法创建这样的文件，因为操作系统不支持如此多字符的文件名。另外，文件所在完整路径的字符也不能超过 _MAX_PATH (260 字符)。 &lt;/span&gt;&#xD;
&lt;p &gt;如果完全限定名的字符数在 200 字符左右，那么您可能需要将 OutputDirectory 配置为一个靠近根目录的位置，这样可以避免文件的完整路径超出 260 字符。&lt;/p&gt;&#xD;
&lt;p &gt;但还没有关于文件名超出 256 字符的解决方法。&lt;/p&gt;&#xD;
&lt;p &gt;在未来某版本的 NDoc 中，我们会尝试解决此问题。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;大小写敏感问题&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;文件名不是大小写敏感的，因此当 MSDN 文档引擎或者 JavaDoc 文档引擎创建 HTML 文件时，如果某些类型或成员只是在大小写上不一样，就会出现问题。 &lt;/span&gt;&#xD;
&lt;p &gt;请尝试避免出现这种情况。（例如：公共属性为 Thing，私有字段为 _thing, 避免出现Thing 和 thing 并行。当然，如果不输出私有字段，并行也没有问题。只是说准备输出的类型/成员不要出现这种情况。）&lt;/p&gt;&#xD;
&lt;p &gt;在未来某版本的 NDoc 中，我们会尝试解决此问题。&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;StrongNameIdentityPermissionAttribute&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;标记有 StrongNameIdentityPermissionAttribute 属性的程序集，需要有特殊的密钥才能被读取。NDoc 尝试为这样的程序集生成代码文档时，会抛出异常。 &lt;br /&gt;您可以考虑使用&amp;#8220;条件编译&amp;#8221;(#if...)方式为 NDoc 准备没有添加该属性的编译版本。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Compact Framework 不兼容&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;为 .NET Compact Framework 编译的程序集，当添加到 NDoc 项目中时，NDoc GUI 程序可能抛出异常。尤其是当该程序集引用了 Microsoft.WindowsCE.Forms 或 SqlServerCe 时，更是如此。 &lt;/span&gt;&#xD;
&lt;p &gt;还没有找到此问题的解决方法。&lt;/p&gt;&#xD;
&lt;p &gt;在未来某版本的 NDoc 中，我们会尝试解决此问题。&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;本地化&lt;/td&gt;&#xD;
&lt;td &gt;NDoc 当前不支持本地化的文档格式及 GUI 文本 &lt;br /&gt;在未来某版本的 NDoc 中，我们 *可能* 会尝试解决此问题。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="2"&gt;&lt;/a&gt;开始之前，您需要准备以下工具，它们可以从网络中获得。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;HTML Help 1 编译器&lt;/strong&gt;&lt;br /&gt;　HTML Help 1 文件，也就是 CHM 文件，是很常见的应用程序帮助文件格式，在 Visual Studio .NET 发布之前，MSDN 一直采用的就是 HTML Help 1 格式。 &lt;/p&gt;&#xD;
&lt;p &gt;如果您准备创建 HTML Help 1 (*.CHM)文件，请确认您已经安装好 Microsoft's HTML Help Workshop。此下载安装包已包含必需的 HTML Help 1 编译器。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Microsoft Help 2 编译器&lt;/strong&gt;&lt;br /&gt;　Microsoft Help 2 是 Microsoft 从 Visual Studio .NET 2002 开始使用的、一种新的帮助文档格式。&lt;/p&gt;&#xD;
&lt;p &gt;如果您准备创建 Microsoft Help 2 (*.HxS)文件，请下载并安装 Visual Studio Help Integration Kit (VSHIK)。此工具包已包含所必需的 Microsoft Help 2 编译器。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Latex 编译器&lt;/strong&gt;&lt;br /&gt;　如果您准备使用 LaTeX 文档引擎创建 dvi 或 pdf 文件，您需要下载并安装一个 LaTeX 系统，比如免费的 MikTeX。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;其他工具&lt;/strong&gt;&lt;br /&gt;　&lt;strong&gt;H2Reg&lt;/strong&gt;&lt;br /&gt;　向客户机部署 Microsoft Help 2 帮助文档，不像 HTML Help 1 那样简单(仅复制即可完成)。VSHIK 工具包介绍了 如何向客户机部署 Microsoft Help 2 帮助文档的详细步骤和指导。&lt;/p&gt;&#xD;
&lt;p &gt;另外一种方案是采用共享软件 H2Reg utility (开发商: helpware.net)。 &lt;/p&gt;&#xD;
&lt;p &gt;H2Reg 许可您将它包含进部署安装包中，它可以用来注册 Microsoft Help 2 命名空间和帮助标题等。H2Reg 使用 INI 文件描述要部署的帮助文档结构。NDoc 创建符合 H2Reg 需要的 INI 文件，指示它进行命名空间的注册工作。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="21"&gt;&lt;/a&gt;首先，您应该确认，您已经打开了 C# 项目的 /doc 开关，当 Visual Studio .NET 编译时，每次都会生成相应的 XML 文档。&lt;/p&gt;&#xD;
&lt;p &gt;如果没有特殊情况，请让项目输出的程序集名称和 XML 文档文件名、仅仅扩展名不同(比如程序集是 NDoc.Test.dll/NDoc.Test.exe，XML 文档是 NDoc.Test.xml)。在 NDoc 中，当您加入某程序集时，NDoc 会自动查找这样的&amp;#8220;同名&amp;#8221; XML 文件。如果找到，就会尝试自动将它当作该程序集的 XML 文档。这样会简化您的操作。&lt;/p&gt;&#xD;
&lt;p &gt;打开项目的&amp;#8220;属性&amp;#8221;对话框，&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/assemblynamedialog.gif" width="642" height="457"  alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;找到程序集名称&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;设置 XML 文档文件为程序集名称(扩展名改为 xml)。别忘了设置此项之前，选择&amp;#8220;所有配置&amp;#8221;，让 Debug 或 Release 配置下，都自动生成 XML 文档。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/xmldocnamedialog.gif" width="642" height="460"  alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;设置 XML 文档文件配置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;现在，每次使用 VS.NET 编译您的程序集，都会自动从源代码中提取所有的 XML 注释，生成 XML 文档文件。&lt;/p&gt;&#xD;
&lt;p &gt;如果您使用的不是 Visual Studio .NET，您同样应该尝试打开 C# 编译器的 /doc 选项。&lt;br /&gt;&lt;br /&gt;　&lt;a name="22"&gt;&lt;/a&gt;&lt;strong&gt;The more, the better&lt;/strong&gt;&lt;br /&gt;　您在代码中书写的 XML 注释越多，最终生成的代码文档越专业。程序集的使用者越能从中获得帮助。&lt;/p&gt;&#xD;
&lt;p &gt;一般而言的最低要求，对于每一个公共类型，应该给它的所有公共的和受保护的成员添加 &amp;lt;summary&amp;gt; 注释，以描述该成员表示什么意义或者会做些什么动作。&lt;/p&gt;&#xD;
&lt;p &gt;在 VS.NET 中，C# 代码编辑器，提供了一些自动完成的功能，帮助我们创建基本的 XML 注释。&lt;/p&gt;&#xD;
&lt;p &gt;比如如下的代码:&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;public class MyClass() { &lt;br /&gt;public MyClass( string s ) { } &lt;br /&gt;} &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;把光标移动到 MyClass 构造函数的上面一空行，敲 '/' 键三次，VS.NET 自动创建一个 summary XML 文档块:&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;public class MyClass() { &lt;br /&gt;/// &amp;lt;summary&amp;gt; &lt;br /&gt;/// &lt;br /&gt;/// &amp;lt;/summary&amp;gt; &lt;br /&gt;/// &amp;lt;param name="s"&amp;gt;&amp;lt;/param&amp;gt; &lt;br /&gt;public MyClass( string s ) { } &lt;br /&gt;} &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;这种操作对于所有可以书写 XML 注释文档的成员都有效。另外，在以 '///' 开头的 XML 注释行中，敲入 '&amp;lt;' 字符，VS.NET 自动感知功能将自动显示可用的 XML 注释标记列表。不过，这个列表不包括 NDoc 所支持的额外的标记，这些额外的标记，您需要手工敲入。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 可以配置为输出所有的成员，包括私有的和内部的成员，虽然这些成员无法在程序集外部被调用，但如果您需要，您可以同样为这些成员添加 XML 注释，NDoc 会帮您生成这样的适合内部使用的代码文档。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="211"&gt;&lt;/a&gt;NDoc 内置的 MSDN, MSDN 2003, VS.NET 文档引擎，支持 C# 程序员参考中的所有 XML 文档注释标记。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 支持扩充的标记和语法。某些标记只能用于特定的类型（类，结构，委托，接口，枚举）或成员（字段，属性，方法，事件等），请参见标记用法。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 将标记区分为三类: Section 标记，Block 标记，Inline 标记。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Section 标记&lt;/strong&gt;&lt;br /&gt;　Section 标记用于定义不同的代码文档的区域。它们都是顶级标记，Block 标记、Inline 标记都应包含在某个 Section 标记的内部。（除非自定义了扩展 XSLT 转换，否则，在 Section 标记外部的 Block 标记或 Inline 标记都被忽略。）&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="16%"&gt;&lt;strong&gt;标记&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="84%"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;event&amp;gt; [NDoc 扩充]&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;对某个成员可能引发的事件的说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;example&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;示例&amp;#8221;，帮助类库使用者理解类型/成员使用方法的示例代码。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;exception&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;对某个成员可以抛出的异常的说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;lt;exclude/&amp;gt; &lt;/span&gt;&#xD;
&lt;p &gt;[NDoc 扩充]&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td &gt;指示 NDoc 文档引擎将被标记的类型/成员排除在代码文档之外。 &lt;br /&gt;与文档引擎的&amp;#8220;可见性&amp;#8221;配置不符的，以 exclude 优先。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;include&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;将代码文件外部的某 XML 文件中的一部分包含进代码文件来。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;lt;overloads&amp;gt; &lt;/span&gt;&#xD;
&lt;p &gt;[NDoc 扩充]&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;为&amp;#8220;重载列表&amp;#8221;页面准备摘要、备注、示例等文档内容。只需在重载成员的第一个成员前面书写此区域即可。 &lt;/span&gt;&#xD;
&lt;p &gt;&amp;lt;overloads&amp;gt; 标记有两种形式:&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;简单的形式，直接在 overload 中写文本，这些文本被处理为&amp;#8220;重载列表&amp;#8221;页面的摘要。没有备注、示例等区域。&lt;/li&gt;&lt;li &gt;复杂的形式，在 overload 内部，包含 summary, remarks, example 等标记分别表示&amp;#8220;重载列表&amp;#8221;页面的摘要、备注、示例等。 &lt;br /&gt;示例: &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;///&amp;lt;overloads&amp;gt;This method has two overloads.&amp;lt;/overloads&amp;gt;&lt;br /&gt;///&amp;lt;summary&amp;gt;This overload just says hello.&amp;lt;/summary&amp;gt;&lt;br /&gt;public void SayHello() { ... }&lt;br /&gt;///&amp;lt;summary&amp;gt;This one says hello to someone.&amp;lt;/summary&amp;gt;&lt;br /&gt;public void SayHello(string toSomeone) { ... }&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;param&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;成员的参数说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;param&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;访问某成员所必需的 .NET Framework 安全性 CodeAccessPermission。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;lt;preliminary&amp;gt; &lt;/span&gt;&#xD;
&lt;p &gt;[NDoc 扩充]&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;将某类型/成员标记为&amp;#8220;预发布&amp;#8221;。内部的文本被当作警告文本用红色显示，可以包含 &amp;lt;para&amp;gt; 表示多行文本。如果缺少内部文本，则显示默认的警告文本: &amp;#8220;[此文档为预发布版本，在未来版本中有可能改变。]&amp;#8221;。 &lt;/span&gt;&#xD;
&lt;p &gt;如果需要把全部类型/成员都标记为&amp;#8220;预发布&amp;#8221;，请使用文档引擎的 Preliminary&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;remarks&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;备注&amp;#8221;，对 &amp;lt;summary&amp;gt; 的进一步注解。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;returns&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;返回值&amp;#8221;。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;seealso&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;向页面的&amp;#8220;请参见&amp;#8221;区域添加一个链接。 &lt;/span&gt;&#xD;
&lt;p &gt;请不要将此标记包含在 &amp;lt;remarks&amp;gt; 内部，它是一个顶级标记。&lt;/p&gt;&#xD;
&lt;p &gt;两种可选的语法:&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;&amp;lt;seealso href="http://www.microsoft.com/china/msdn/"&amp;gt;MSDN(CHS)&amp;lt;/seealso&amp;gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;lt;seealso cref="System.Data.DataSet"&amp;gt;DataSet&amp;lt;/seealso&amp;gt; &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;summary&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;摘要&amp;#8221;，对类型/成员的摘要说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;lt;threadsafety&amp;gt; &lt;/span&gt;&#xD;
&lt;p &gt;[NDoc 扩充]&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;#8220;线程安全&amp;#8221;，说明类型在多线程环境中是否安全。 &lt;/span&gt;&#xD;
&lt;p &gt;NDoc 提供 static 和 instance 两个布尔的属性，可以自动生成像 .NET Framework SDK 类库文档中那样的标准文本。&lt;/p&gt;&#xD;
&lt;p &gt;threadsafety 标记内部可以包含额外的文本，会被显示到标准文本的下方，说明额外的信息。例如:&lt;/p&gt;&#xD;
&lt;p &gt;/// &amp;lt;summary&amp;gt;The summary description for SafeClass.&amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;threadsafety static="true" instance="true"&amp;gt;&lt;br /&gt;/// &amp;lt;para&amp;gt;More information about using this class across thread&amp;lt;/para&amp;gt;&lt;br /&gt;/// &amp;lt;/threadsafety&amp;gt;&lt;br /&gt;public class SafeClass() { ... }&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;value&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;属性值&amp;#8221;。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Block 标记&lt;/strong&gt;&lt;br /&gt;　Block 标记用于 Section 标记的内部，它们将显示在单独的行中。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;标记&lt;/td&gt;&#xD;
&lt;td &gt;说明&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;code&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;多行的代码块。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;list&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;一个列表或表格。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;lt;note&amp;gt; &lt;/span&gt;&#xD;
&lt;p &gt;[NDoc 扩充]&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;#8220;注意&amp;#8221;块。 &lt;/span&gt;&#xD;
&lt;p &gt;例如:&lt;/p&gt;&#xD;
&lt;p &gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// &amp;lt;note&amp;gt;This is a note in the summary.&amp;lt;/note&amp;gt;&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class SomeClass() { ... }&lt;br /&gt;将生成:&lt;/p&gt;&#xD;
&lt;p &gt;注意 This is a note in the summary.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;para&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;表示一个段落。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Inline 标记&lt;/strong&gt;&lt;br /&gt;Inline 标记可以用于其他 Section 标记或 Block 标记内部，它们将和前后的文本显示在同一行中。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;标记&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;c&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;将内部文本格式化为代码样式，用于表示行文中提到的短小代码片段。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;paramref&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;加入指向方法参数的链接。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;see&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;加入指向某个类型/成员或网络 URL 的链接。 &lt;/span&gt;&#xD;
&lt;p &gt;两种可选的语法:&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;&amp;lt;see href="http://www.microsoft.com/china/msdn/"&amp;gt;MSDN(CHS)&amp;lt;/see&amp;gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;lt;see cref="System.Data.DataSet"&amp;gt;DataSet&amp;lt;/see&amp;gt; &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;lt;see langword="xxx"/&amp;gt;&lt;br /&gt;其中 xxx 可以是 null, sealed, static, abstract 或 virtual。 &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="212"&gt;&lt;/a&gt;NDoc 中的 MSDN 文档引擎和 VS.NET 文档引擎使用了一些 属性 来控制代码文档中一些特殊样式。 &lt;/p&gt;&#xD;
&lt;p &gt;如果类型或成员具有以下属性，NDoc 将显示相应的特殊样式，使文档看起来更加专业。 &lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;属性&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ObsoleteAttribute&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;标记该类型或成员为&amp;#8220;已过时。&amp;#8221;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;FlagsAttribute&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;指示可以将枚举作为位域（即一组标志）处理，允许按位组合其成员值。 &lt;br /&gt;NDoc 将仿照 .NET Framework SDK 文档中处理方式： &lt;/span&gt;&#xD;
&lt;ul&gt;&lt;li &gt;在该枚举摘要下面显示&amp;#8220;此枚举具有允许按位组合其成员值的 FlagsAttribute 属性。&amp;#8221;&lt;/li&gt;&lt;li &gt;在枚举成员的列表中添加&amp;#8220;值&amp;#8221;列，显示每个枚举成员对应的枚举值。 &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;EditorBrowsableAttribute&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;使用此属性(attribute)的成员将不显示在 VS.NET 的属性窗口、对象浏览器及智能感知等列表中，根据 NDoc 项目配置中的 EditorBrowsableFilter 配置，NDoc 可以将这部分被隐藏的成员排除在代码文档之外。 &lt;br /&gt;注：在 NDoc 1.3 中，我们推荐您使用 &amp;lt;exclude/&amp;gt; XML 文档标记在代码文档中隐藏某些类型或成员。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AssemblyVersionAttribute&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;根据 NDoc 项目配置中的 AssemblyVersionInfo 配置，NDoc 可以在代码文档中包含通过 AssemblyVersionAttribute 属性指定的程序集版本信息。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="23"&gt;&lt;/a&gt;&lt;strong&gt;新建 NDoc 项目和添加程序集&lt;/strong&gt;&lt;br /&gt;　如果您使用 Visual Studio.NET 开发工具，那么最简单的方法就是点击工具条中的&amp;#8220;从 Visual Studio .NET 解决方案新建 NDoc 项目...&amp;#8221;按钮。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/newfromvsnet.gif" width="334" height="106"  alt="" /&gt;&lt;br /&gt;　然后，NDoc 会要求您选择某种编译配置(如 Debug 或 Release，或者其他您自定义的编译配置)，这取决于您将使用哪种编译配置下生成的程序集和 XML 文档。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/configuration.gif" width="245" height="197"  alt="" /&gt;&lt;br /&gt;&lt;strong&gt;　编译配置选择对话框&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;#8220;确定&amp;#8221;之后，NDoc 项目设计器将自动生成一个新的 NDoc 项目，其中已包含解决方案中各个项目生成的程序集和相应的 XML 文档。&lt;/p&gt;&#xD;
&lt;p &gt;如果您没有使用 Visual Studio .NET，则需要手工向 NDoc 项目添加要生成代码文档的程序集和相应的 XML 文档。您可以通过点击设计器重的&amp;#8220;添加&amp;#8221;按钮、从文件系统中浏览并选择要添加的程序集，也可以直接从 Windows 资源管理器或&amp;#8220;我的电脑&amp;#8221;中、直接拖动要生成代码文档的程序集、到设计器中的程序集列表框中。&lt;/p&gt;&#xD;
&lt;p &gt;请确保您打开了 /doc 文档输出的选项，否则 NDoc 输出的代码文档只能有很少的内容。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;选择文档引擎&lt;/strong&gt;&lt;br /&gt;　NDoc 内置了若干文档引擎，它们可以用于生成不同风格、样式、格式的代码文档。每种文档引擎都定义了它自己的排版、格式，以及要输出的内容。&lt;/p&gt;&#xD;
&lt;p &gt;最受欢迎的两种文档引擎是 MSDN 和 VS.NET 2003。它们都生成类似 .NET Framework SDK 类库文档样式的代码文档，不同的是前者最终编译成 HTML Help 1 （即 *.CHM）格式的整合文件，后者最终编译成 Microsoft Help 2 (即以形如 ms-help://... 的 URI 地址访问的文档)格式的形式。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 1.3 中，新增了 MSDN 2003 文档引擎，在保留 MSDN 文档引擎的特点之外，向接近 .NET Framework SDK 类库文档的方向又前进了一大步：加入了语言选择器等特色功能。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/selectdocumenter.gif" width="362" height="149"  alt="" /&gt; &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;NDoc 文档引擎&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;br /&gt;　选择好文档引擎，并做好相应的配置。您就可以点击&amp;#8220;生成&amp;#8221;按钮让 NDoc 创建您需要的代码文档了。设计器下方的&amp;#8220;输出&amp;#8221;窗口中将显示文档制作中的消息，状态条上的进度条指示生成的整体进度。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/buildprogress.gif" width="500" height="162"  alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;NDoc 生成进度&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;查看文档&lt;/strong&gt;&lt;br /&gt;　生成成功后，您可以点击&amp;#8220;查看文档&amp;#8221;按钮查看生成的代码文档。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;&lt;a name="4"&gt;&lt;/a&gt;概述&lt;/strong&gt;&lt;br /&gt;　NDoc 项目文件保存了您要输出代码文档的程序集、相应的 XML 文档、选用的文档引擎及配置参数等信息。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/designer.gif" width="501" height="833"  alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;NDoc 项目设计器&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;新建 NDoc 项目的工作可以很简单：选择要输出代码文档的程序集、相应的 XML 文档、选择一个文档引擎并做好配置参数。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;命名空间摘要&lt;/strong&gt;&lt;br /&gt;　标准的 C# 注释 XML 文档中，没有提供任何标记为命名空间提供&amp;#8220;summary&amp;#8221;文档。NDoc 提供了两种途径允许您为命名空间提供&amp;#8220;summary&amp;#8221;文档。一种是通过在您的代码加入特定的类，并对 NDoc 文档引擎作相应配置（请参见 NDoc 文档引擎 中关于 UseNamespaceDocSummaries 配置项的说明）。另一种途径是通过项目设计器指定各命名空间的摘要文档。&lt;/p&gt;&#xD;
&lt;p &gt;在项目设计器中，单击&amp;#8220;命名空间摘要&amp;#8221;按钮，在弹出的&amp;#8220;编辑命名空间摘要&amp;#8221;对话框中，给每个命名空间填写摘要文档。&lt;/p&gt;&#xD;
&lt;p &gt;这些摘要文档将包含在最终生成的代码文档中。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/editnamespace.gif" width="419" height="285"  alt="" /&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;br /&gt;各种文档引擎间共享一些基本配置项，比如输出过滤(是否输出 private 成员等)，缺少文档时的处理对策等；各文档引擎又包含自己的某些特殊配置项。这些配置项都可以通过项目设计器查看、更改，并保存到项目文件中。&lt;/p&gt;&#xD;
&lt;p &gt;设计器中配置项以类别排列，并且，选中某一配置项时会显示一小段提示文本，说明该配置项的用途和用法。这些都将帮助您快速掌握这些文档引擎的使用方法。&lt;/p&gt;&#xD;
&lt;p &gt;关于完整的文档引擎列表，及其配置项，请参见 NDoc 文档引擎。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="41"&gt;&lt;/a&gt;&lt;strong&gt;选项&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;选项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowProgressOnBuild&lt;/td&gt;&#xD;
&lt;td &gt;如果为真，在文档生成动作启动时，消息输出窗口将自动显示出来。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;LoadLastProjectOnStartup&lt;/td&gt;&#xD;
&lt;td &gt;如果为真，每次启动 NDoc 时将自动加载最后一次打开的项目文件。此配置和登陆的 Windows 用户相关。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;MRUSize&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;最近的项目&amp;#8221;列表中显示的最大条目数。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;HtmlHelpWorkshopLocation&lt;/td&gt;&#xD;
&lt;td &gt;HTML Help Workshop 软件安装路径，即 HHC.exe 编译器的所在目录。仅对 MSDN 和 MSDN 2003 文档引擎有效。 &lt;br /&gt;&lt;br /&gt;默认情况下，MSDN 和 MSDN 2003 文档引擎会尝试查找 HTML Help 1 编译器的所在位置，但仍会出现无法定位的情况。这时，NDoc 会提示您无法找到 HHC.exe 编译器，您需要设置此配置项解决问题。 &lt;br /&gt;&lt;br /&gt;此配置为机器级别的配置，在此机器上的任何 Windows 用户都共享此配置。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="5"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　NDoc 不仅提供了 GUI 的界面，也同时提供了命令行工具(NDocConsole.exe)，为和其他开发工具集成提供了方便。&lt;br /&gt;　&lt;strong&gt;&lt;br /&gt;　语法&lt;/strong&gt;&lt;br /&gt;　NDoc 命令行使用简单的&amp;#8220;name-value 对&amp;#8221;语法来指定相应的配置项。每个选项前用一个短线，如：-name=value，短线和等号周围不要有空格。下面语法叙述中，中括号的部分是可选的。路径中如果包含有空格，则需要用引号(")括起来。&lt;br /&gt;　用法 1&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;NDocConsole 程序集[,XML文档] [程序集[,XML文档]]...&lt;br /&gt;[[-referencepath=文件夹] [-referencepath=文件夹]...]&lt;br /&gt;[-namespacesummaries=文件名]&lt;br /&gt;[-documenter=文档引擎]&lt;br /&gt;[[-引擎参数=值] [-引擎参数=值]...]&lt;br /&gt;[-verbose]&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;注释: &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;程序集: 要生成文档的完整路径。&lt;/li&gt;&lt;li &gt;XML文档: 对应的 XML 文档（C# 编译器 /doc 输出的 XML 文档）。 &lt;br /&gt;缺省时，将自动查找和程序集相同路径、相同名称，仅扩展名不同(.xml)的 XML 文件代替。&lt;/li&gt;&lt;li &gt;referencepath: 引用的第三方 dll 的搜索路径。&lt;/li&gt;&lt;li &gt;namespacesummaries: 要使用的 命名空间摘要 XML 文档 的完整路径。&lt;/li&gt;&lt;li &gt;documenter: 要使用的文档引擎的名称。注意此项区分大小写。 &lt;br /&gt;缺省时，将使用 MSDN 文档引擎。&lt;/li&gt;&lt;li &gt;引擎参数: 文档引擎的配置参数名称，注意此项区分大小写。&lt;/li&gt;&lt;li &gt;值: 给引擎参数设置的值。&lt;/li&gt;&lt;li &gt;verbose: 显示文档生成进度的输出消息。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;用法 2&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;NDocConsole -recurse=文件夹[,最大读取深度]&lt;br /&gt;[[-referencepath=文件夹] [-referencepath=文件夹]...]&lt;br /&gt;[-namespacesummaries=文件名]&lt;br /&gt;[-documenter=文档引擎]&lt;br /&gt;[[-引擎参数=值] [-引擎参数=值]...]&lt;br /&gt;[-verbose]&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;注释: &lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;recurse: 您可以将要生成文档的程序集和它们对应的 XML 文档放在同一文件夹中（注意：XML 文档的文件名应和对应的程序集文件名相同，仅扩展名不同），将此文件夹指定给此参数，NDoc 将自动查找程序集和 XML 文档。这是一种比较简单的用法。&lt;/li&gt;&lt;li &gt;最大读取深度: 在 recurse 参数指定的文件夹中的读取深度。&lt;/li&gt;&lt;li &gt;referencepath: 引用的第三方 dll 的搜索路径。&lt;/li&gt;&lt;li &gt;namespacesummaries要使用的 命名空间摘要 XML 文档 的完整路径。&lt;/li&gt;&lt;li &gt;documenter: 要使用的文档引擎的名称。注意此项区分大小写。 &lt;br /&gt;缺省时，将使用 MSDN 文档引擎。&lt;/li&gt;&lt;li &gt;引擎参数: 文档引擎的配置参数名称，注意此项区分大小写。&lt;/li&gt;&lt;li &gt;值: 给引擎参数设置的值。&lt;/li&gt;&lt;li &gt;verbose: 显示文档生成进度的输出消息。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;用法 3&lt;/strong&gt;&lt;br /&gt;　NDocConsole [-documenter=文档引擎] -project=NDOC项目文件 [-verbose]&lt;br /&gt;　&lt;br /&gt;　注释: &lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;documenter: 要使用的文档引擎的名称。注意此项区分大小写。 &lt;br /&gt;缺省时，将使用 MSDN 文档引擎。&lt;/li&gt;&lt;li &gt;project: 您可以使用 NDoc GUI 界面保存一个 NDoc 项目文件，然后设置给此参数。&lt;/li&gt;&lt;li &gt;verbose: 显示文档生成进度的输出消息。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;用法 4&lt;/strong&gt;&lt;br /&gt;　NDocConsole [-help] [文档引擎 [引擎参数]]&lt;br /&gt;　&lt;br /&gt;　where: &lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;help: 显示命令行帮助信息。 &lt;br /&gt;如果文档引擎参数没有指定，显示 NDoc 命令行的基本语法。&lt;/li&gt;&lt;li &gt;文档引擎: 显示此文档引擎的帮助信息（如：可用的配置参数项等）。注意此项区分大小写。 &lt;br /&gt;如果引擎参数没有指定，显示此文档引擎可用的配置参数列表。&lt;/li&gt;&lt;li &gt;引擎参数: 显示文档引擎的某配置参数的信息，如描述、默认值。若参数为枚举类型，还会列出可用的枚举值（使用时注意区分大小写）。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;可用的文档引擎 &lt;/strong&gt;&lt;br /&gt;　NDoc 1.3 自带的文档引擎包括: JavaDoc, LaTeX, LinearHtml, MSDN, MSDN_2003, VS.NET_2003, 以及 XML。&lt;/p&gt;&#xD;
&lt;p &gt;您可以使用 NDocConsole -help 看到实际的列表。&lt;/p&gt;&#xD;
&lt;p &gt;命名空间摘要 XML 文档的语法&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;&amp;lt;namespaces&amp;gt;&lt;br /&gt;&amp;lt;namespace name="My.NameSpace"&amp;gt;My summary.&amp;lt;/namespace&amp;gt;&lt;br /&gt;&amp;lt;namespace name="My.OtherNameSpace"&amp;gt;My other summary.&amp;lt;/namespace&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/namespaces&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="51"&gt;&lt;/a&gt;&lt;strong&gt;配置 NAnt&lt;/strong&gt;(暂无) &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置 VS.NET&lt;/strong&gt;&lt;br /&gt;　您可以利用 VS.NET 中提供的生成事件功能，将 NDoc 配置为在每次代码编译完成后、自动生成相应的代码文档。同时 NDoc 代码文档生成将花费不少时间，因此建议您只在 Release 配置状态(或其他自定义的配置状态)时允许自动文档生成。&lt;/p&gt;&#xD;
&lt;p &gt;而 C# 项目的生成事件并不区分各种配置状态(如 Debug 或 Release )，因此需要在生成事件的脚本中添加对配置状态(VS.NET 内置的编译变量)的判断，如：&lt;/p&gt;&#xD;
&lt;p &gt;if $(ConfigurationName) == Release&lt;br /&gt;　因为直接在生成事件窗口中正确书写 NDoc 命令行命令及相关参数、很困难也很容易出现错误，因此您可以将命令写在一个批处理 .bat 文件中，而在项目的生成后事件中引用这个批处理文件(如下图)，这样比较容易书写和维护。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/build_event.gif" width="433" height="296"  alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Calling a batch file from the post-build event&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p &gt;一个解决方案中有多个项目时，如果您要得到一份整合的代码文档，您可以只在编译顺序中最后的那个项目配置中，填写这个生成后事件命令。如果您想为每个项目单独生成一份文档，则需要分别去配置。您可以根据您的实际情况决定。&lt;/p&gt;&#xD;
&lt;p &gt;关于 NDoc.bat 中的写法，您可以参考下面的命名行（它对应于上面图中的生成后事件命令）：&lt;/p&gt;&#xD;
&lt;p &gt;IF NOT %1 == Release GOTO end&lt;/p&gt;&#xD;
&lt;p &gt;"%ProgramFiles%\NDoc 1.3\bin\net\1.1\NDocConsole.exe" -recurse="%2bin\%1"&lt;/p&gt;&#xD;
&lt;p &gt;:end&lt;br /&gt;　复杂的解决方案中，可能需要更加复杂的配置，比如有时配置第三方 dll 的搜索路径等，仔细研究一下 NDocConsole.exe -help 的帮助信息吧！&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;其他开发工具的配置&lt;/strong&gt;&lt;br /&gt;　大多数开发工具都有运行命令行程序的选项，这些开发工具都可以使用 NDoc 命令行来实现代码文档的自动生成。每种开发工具的配置方法可能不同，但思路都很类似上面关于 VS.NET 中的想法。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a id="61" name="61"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　文档引擎是生成各种格式代码文档的组件。NDoc 1.3 内建了以下文档引擎:&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;VS.NET&lt;/li&gt;&lt;li &gt;MSDN&lt;/li&gt;&lt;li &gt;MSDN 2003&lt;/li&gt;&lt;li &gt;XML&lt;/li&gt;&lt;li &gt;JavaDoc&lt;/li&gt;&lt;li &gt;LinearHtml&lt;/li&gt;&lt;li &gt;LaTeX &lt;br /&gt;NDoc 的设计具有很强的可扩展性，您可以自己创作输出特定格式文档的、新的文档引擎。 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;代码文档的制作一般分作两大环节:&lt;/p&gt;&#xD;
&lt;ol&gt;&lt;li &gt;将从程序集中通过反射发出读取的类型/成员信息，和 /doc XML 文档中的注释文档，合并在一起，即 NDoc 中间 XML 数据文件。&lt;/li&gt;&lt;li &gt;通过 XSLT 转换将 NDoc 中间 XML 数据文件转换为目标 HTML 格式。 &lt;br /&gt;您可以通过 XML 文档引擎得到 NDoc 中间 XML 数据文件，经过分析和转换，创作您自己的文档引擎。 &lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;p &gt;下面配置项，是 NDoc 所有文档引擎中通用的配置项，各文档引擎还可以有自己的一些特殊配置，详见文档引擎的文档。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;通用的配置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#999999"&gt;&#xD;
&lt;td &gt;&lt;strong&gt;配置项 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;strong&gt;说明 &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;(全局)&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ReferencePaths&lt;/td&gt;&#xD;
&lt;td &gt;一组额外的程序集搜索路径。&lt;br /&gt;注意：这是一个 NDoc 项目级别的属性，各文档引擎共享此项配置。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;&lt;strong&gt;文档主要配置&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AssemblyVersionInfo&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;如何输出版本信息。&lt;br /&gt;可选项为: &lt;/span&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="80%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;None &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;不输出版本信息。(默认选项) &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AssemblyVersion &lt;/td&gt;&#xD;
&lt;td &gt;输出标准 .NET 的版本号，即通过 AssemblyVersionAttribute 属性设置的版本号。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AssemblyFileVersion &lt;/td&gt;&#xD;
&lt;td &gt;通过 AssemblyFileVersionAttribute 属性指定的版本号。如果程序集需要安装到 GAC，通过这种方式指定程序集的版本比较常见。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AutoDocumentConstructors&lt;/td&gt;&#xD;
&lt;td &gt;若此项为真，文档引擎将为类型的默认构造函数(即不附带参数的那个构造函数)添加默认的 summary 文档。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AutoPropertyBackerSummaries&lt;/td&gt;&#xD;
&lt;td &gt;若此项为真，文档引擎会把字段 _Length 或 length 视为属性 'Length' 的辅助字段，在 _Length 或 length 缺少文档信息时，自动为它添加 summary 信息(&amp;#8220;属性 Length 的辅助字段。&amp;#8221;)。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;CleanIntermediates&lt;/td&gt;&#xD;
&lt;td &gt;是否在文档成功生成后，删除中间文件。 &lt;br /&gt;比如 MSDN 和 VS.NET 文档引擎会编译为单一文件，它们的中间文件包括所有编译前的网页、HTML Help 项目文件等。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;CopyrightHref&lt;/td&gt;&#xD;
&lt;td &gt;版权声明文本的超链接地址。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;CopyrightText&lt;/td&gt;&#xD;
&lt;td &gt;版权声明文本，将被输出到代码文档的每个页面中。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;FeedbackEmailAddress&lt;/td&gt;&#xD;
&lt;td &gt;用户反馈接收 Email 地址。将在输出的代码文档每页的底部添加放置指向此 Email 地址的超链接。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Preliminary&lt;/td&gt;&#xD;
&lt;td &gt;若此项为真，文档引擎将在每个页面中添加红色的消息&amp;#8220;[此文档为预发布版本，在未来版本中有可能改变。]&amp;#8221;。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SdkDocLanguge&lt;/td&gt;&#xD;
&lt;td &gt;指示文档引擎应将 .NET Framework 标准类库中包含的类型的超链接指向哪种本地化语言版本的 .NET Framework SDK。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SdkDocVersion&lt;/td&gt;&#xD;
&lt;td &gt;指示文档引擎应将 .NET Framework 标准类库中包含的类型的超链接指向哪个版本的 .NET Framework SDK。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;UseNamespaceDocSummaries&lt;/td&gt;&#xD;
&lt;td &gt;若此项为真，文档引擎将在每个命名空间中查找一个名为 NamespaceDoc 的类，并将它的 summary 信息作为这个命名空间的 summary，这个类本身不会出现在最终的代码文档中。 &lt;br /&gt;如果需要，您可以使用 #if ... #endif，配合条件编译常数，在最终 Release 程序集中排除 NamespaceDoc 类。&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;UseNDocXmlFile&lt;/td&gt;&#xD;
&lt;td &gt;主要用于调试用途，一般情况下请留空白。NDoc 会首先生成中间 XML 数据文件（可以使用 XML 文档引擎得到），然后通过 XLST 转换为各种 HTML 格式。如果希望创作自定义的文档引擎，可以将此选项配置为事先生成的一个 NDoc 中间 XML 数据文件，这样将提高您的调试效率。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;属性(attribute)的输出&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentAttributes &lt;/td&gt;&#xD;
&lt;td &gt;是否输出类型和成员的属性(attribute)。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentedAttributes &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;属性(attribute)输出的过滤。当 DocumentAttributes = true 时，此配置指示将输出哪些属性，其他属性被过滤掉。 &lt;br /&gt;请使用编辑器生成，有效的格式应为： &lt;/span&gt;&#xD;
&lt;p &gt;'&amp;lt;attribute-name-starts-with&amp;gt;,&amp;lt;property-to-show&amp;gt;,&amp;lt;property-to-show&amp;gt;|&amp;lt;attribute-name-starts-with&amp;gt;,&amp;lt;property-to-show&amp;gt;,&amp;lt;property-to-show&amp;gt;|(etc...)'&lt;/p&gt;&#xD;
&lt;p &gt;如果为空白，则输出全部属性。&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;DocumentInheritedAttributes &lt;/td&gt;&#xD;
&lt;td &gt;是否输出从基类中继承而来的属性(attribute)。如果 DocumentAttributes = false，则此配置被忽略。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowTypeIdInAttributes &lt;/td&gt;&#xD;
&lt;td &gt;是否在属性(attribute)输出时输出 TypeId 值。如果 DocumentAttributes = false，则此配置被忽略。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  colspan="2"&gt;缺少文档时的输出&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowMissingParams &lt;/td&gt;&#xD;
&lt;td &gt;缺少 &amp;lt;param&amp;gt; 参数文档时，是否输出红色的提示文本。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowMissingRemarks &lt;/td&gt;&#xD;
&lt;td &gt;缺少 &amp;lt;remarks&amp;gt; 备注文档时，是否输出红色的提示文本。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowMissingReturns &lt;/td&gt;&#xD;
&lt;td &gt;缺少 &amp;lt;returns&amp;gt; 返回值文档时，是否输出红色的提示文本。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowMissingSummaries &lt;/td&gt;&#xD;
&lt;td &gt;缺少 &amp;lt;summary&amp;gt; 概述文档时，是否输出红色的提示文本。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowMissingValues &lt;/td&gt;&#xD;
&lt;td &gt;缺少 &amp;lt;values&amp;gt; 属性值文档时，是否输出红色的提示文本。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="611"&gt;&lt;/a&gt;&lt;strong&gt;XLinks&lt;/strong&gt;&lt;br /&gt;　HTML Help 1 直接使用 HTML &amp;lt;A&amp;gt; 标记表示超链接。Microsoft Help 2 引入了新的 XLinks 机制 (是微软对 W3C XLinks 的一个实现)，来表示指向其他文档集合的超链接。一个 XLink 很像 HTML &amp;lt;A&amp;gt; 链接，但包含额外的元数据用于表示复杂的链接。Microsoft Help 2 使用 XLinks 不直接使用路径/文件名，而根据在&amp;#8220;索引&amp;#8221;表中检索特定的关键字查找。 &lt;/p&gt;&#xD;
&lt;p &gt;NDoc 为指向 .NET Framework 类型/成员的链接（包括成员列表中指向基类型的链接、以及使用 &amp;lt;see&amp;gt; 标记加入的指向 .NET Framework 或第三方类库中的类型/成员的显式链接），制作 XLinks 链接。下面是一个指向 System.Void 的示例 XLink: &lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:link &lt;/p&gt;&#xD;
&lt;p &gt;keywords="frlrfSystemVoidClassTopic" &lt;/p&gt;&#xD;
&lt;p &gt;indexMoniker="!DefaultAssociativeIndex" &lt;/p&gt;&#xD;
&lt;p &gt;namespace="ms-help://MS.NETFrameworkSDKv1.1.CHS"&amp;gt;void&amp;lt;/MSHelp:link&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;上面 XLink 的三个属性指示了查找这个帮助主题的方法。属性 namespace 指示在哪个文档命名空间中查找(每个帮助文档集合都需要在机器中注册一个唯一的命名空间，如上面的 ms-help://MS.NETFrameworkSDKv1.1.CHS 表示 .NET Framework SDK 类库文档的帮助文档集合)。属性 indexMoniker 指示使用哪种类型的&amp;#8220;索引&amp;#8221;(Microsoft Help 2 索引可以有很多类型，其中，DefaultAssociativeIndex 常用于创建帮助主题之间的关联)。最后，keyword 指示要指向哪个帮助主题页面。&lt;/p&gt;&#xD;
&lt;p &gt;每个页面头部的嵌入 XML 数据岛中都包含若干 Keywords，您可以在 .NET Framework SDK 类库文档中查看 System.Void 页面中，包含如下的一行:&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Keyword Index="A" Term="frlrfSystemVoidMembersTopic"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;这个 frlrfSystemVoidMembersTopic 就是在 .NET Framework SDK 类库文档中，用 DefaultAssociativeIndex 类型的&amp;#8220;索引&amp;#8221;中的 keyword。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;链接到 .NET Framework SDK 类库文档&lt;/strong&gt;&lt;br /&gt;　指向到 .NET Framework SDK 类库文档的超链接，不需要您费心，NDoc 已经可以做的很好。您尽管从 .NET Framework 的基类型继承、创作您的子类型，或者使用 &amp;lt;see&amp;gt; 等标记加入这些链接，NDoc 自动处理这些关于 XLinks 的事情。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;链接到第三方类库文档&lt;/strong&gt;&lt;br /&gt;　NDoc 允许您创建指向到第三方类库文档的超链接，不过也需要严格按照上面介绍的 XLinks 体制来做。首先找到该文档集合的命名空间，和要指向的帮助主题 HTML 页头部中的 keyword，做好准备。(如果那个文档集合也是用 NDoc 1.3 生成的，则页面头部的 XML 数据岛已经按要求写好了 keyword。)&lt;/p&gt;&#xD;
&lt;p &gt;因为 NDoc 只能找到子类型的父类型的名称，&amp;lt;see&amp;gt; 标记中最终 NDoc 看到的也只是要指向的类型/成员的完全名称；NDoc 不知道这些类型/成员的文档存在哪个文档集合中。您需要告诉 NDoc：哪些类型/成员的帮助文档在哪个文档命名空间，而另一些类型/成员在另一个文档命名空间，也就是各 .NET 类型/成员和 Microsoft Help 2 帮助文档命名空间之间的映射关系。这就需要您指定 NamespaceMappingFile 了（请参见 VS.NET 2003 文档引擎的 UseHelpNamespaceMappingFile 配置项）。NamespaceMappingFile 是一个 XML 文件，它必须符合 NamespaceMapping XSD 架构(请右击&amp;#8220;另存为...&amp;#8221;)。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;namespaceMap xmlns="urn:ndoc-sourceforge-net:documenters.NativeHtmlHelp2.schemas.namespaceMap"&amp;gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;helpNamespace ns="ms-help://companyX.sharedhelpcollection"&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;managedNamespace ns="CompanyX"/&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/helpNamespace&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;helpNamespace ns="ms-help://companyX.producthelpcollection"&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;managedNamespace ns="CompanyX.Product1"/&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;managedNamespace ns="CompanyX.Product2"/&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;/helpNamespace&amp;gt; &lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;/namespaceMap&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;NamespaceMappingFile 的 一个实例:&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;namespaceMap xmlns="urn:ndoc-sourceforge-net:documenters.NativeHtmlHelp2.schemas.namespaceMap"&amp;gt;&lt;br /&gt;&amp;lt;helpNamespace ns="ms-help://MS.NETFrameworkSDKv1.1.CHS"&amp;gt;&lt;br /&gt;&amp;lt;managedNamespace ns="System" /&amp;gt;&lt;br /&gt;&amp;lt;managedNamespace ns="Microsoft" /&amp;gt;&lt;br /&gt;&amp;lt;/helpNamespace&amp;gt;&lt;br /&gt;&amp;lt;/namespaceMap&amp;gt;&lt;br /&gt;&lt;br /&gt;　上面的例子表示指向 System 和 Microsoft 命名空间的类型/成员的链接，将被指向 ms-help://MS.NETFrameworkSDKv1.1.CHS 帮助文档命名空间。&lt;/p&gt;&#xD;
&lt;p &gt;指定了 NamespaceMappingFile 之后，其他的工作都可以交给 NDoc 来做了。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="612"&gt;&lt;/a&gt;&lt;strong&gt;与 Visual Studio .NET IDE 的集成&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　.NET Framework SDK 类库文档的每一个页面的头部都有一个嵌入的 XML 数据岛。在 Microsoft 文档资源管理器中，这些 XML 数据岛用于创建索引，链接帮助主题，查找关键字，筛选帮助主题，以及很多其他功能。Visual Studio .NET IDE 中的&amp;#8220;动态帮助&amp;#8221;功能也依赖于这些嵌入的 XML 数据。以下是一个 XML 数据岛示例：&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;xml&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:TOCTitle Title="Object Class"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:RLTitle Title="Object Class"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Keyword Index="K" Term="Object class, about Object class"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Keyword Index="A" Term="frlrfSystemObjectClassTopic"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Keyword Index="F" Term="System.Object"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DocSet" Value="NETFramework"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="TopicType" Value="kbSyntax"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DevLang" Value="CSharp"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DevLang" Value="VB"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DevLang" Value="C++"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DevLang" Value="JScript"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DevLang" Value="VJ#"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="Technology" Value="WFC"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="Technology" Value="ManagedC"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="TechnologyVers" Value="kbWFC"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="TechnologyVers" Value="kbManagedC"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="Locale" Value="kbEnglish"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="DocSet" Value="NETCompactFramework"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="TechnologyVers" Value="kbProfile2NETCF"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MSHelp:Attr Name="HelpPriority" Value="2"/&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;/xml&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;NDoc VS.NET 文档引擎同样创建这样的 XML 数据岛，以提高和 Microsoft 文档资源管理器以及 VS.NET IDE 的集成性。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;要求&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　尽管 NDoc 为每一帮助主题生成必要的 XML 数据岛，但要更好的利用 Microsoft Help 2 的功能（如筛选器等），还需要了解更多的背景知识。&lt;/p&gt;&#xD;
&lt;p &gt;Help Title 必须存在于一个帮助集合中。&lt;/p&gt;&#xD;
&lt;p &gt;Microsoft Help 2 定义了两个级别的帮助文档容器：Help Title 和帮助集合。Help Title 是一组相关的帮助主题，编译为一个 .HxS 文件。帮助集合是一个或多个 Help Title 的集合。(您可以这样理解：一个 Help Title 可以被当作一个帮助集合，但反过来不成立。) 每个帮助集合必须分配有一个唯一的命名空间。&lt;/p&gt;&#xD;
&lt;p &gt;只有帮助集合才能被集成到 VS.NET 的帮助系统中。&lt;/p&gt;&#xD;
&lt;p &gt;帮助集合必须在每台机器上注册后才能被访问。&lt;/p&gt;&#xD;
&lt;p &gt;Microsoft Help 2 帮助系统维护一个注册表(不要和 Windows 注册表混淆)，保存当前机器中所有已安装的帮助集合。此注册表用于定位超链接的目的地，执行检索，显示索引等。这是 Microsoft Help 2 中一个核心的部分。&lt;/p&gt;&#xD;
&lt;p &gt;因为这个原因，帮助集合必须在安装时注册到每台客户端机器中，否则将无法访问得到。&lt;/p&gt;&#xD;
&lt;p &gt;已注册的帮助集合可以被&amp;#8220;plugged-in&amp;#8221;进 VS.NET 合并文档集合。&lt;/p&gt;&#xD;
&lt;p &gt;Microsoft Help 2 允许帮助集合的插接。可以将您的帮助集合插接到其他已有的帮助集合中，比如 VS.NET 合并文档集合，它的命名空间是 MS.VSCC.2003。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;还很糊涂？&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　Microsoft Help 2 确实是一套复杂的技术。更深入的信息请查阅 VSHIK 文档。网站 helpware.net 提供了很多有关 Microsoft Help 2 的有用资料和教程。HelpWare 还提供了一个名为 FAR 的共享软件，它更证明了 Microsoft Help 2 帮助系统的潜力。&lt;/p&gt;&#xD;
&lt;p &gt;VS.NET 文档引擎使用了几个配置项，意在简化整个过程。&lt;/p&gt;&#xD;
&lt;p &gt;首先，您应该设置 GenerateCollectionFiles 为 true。这将指示 NDoc 将生成的文档合并到 VS.NET 合并文档集合中去。&lt;/p&gt;&#xD;
&lt;p &gt;然后，您需要指定 CollectionNamespace，帮助集合的命名空间名称。不要使用空格、汉字等 URI 中不允许的字符。建议您设法让这个命名空间名称不容易重复，比如以您的公司名开始，等等。&lt;/p&gt;&#xD;
&lt;p &gt;第三步，指定 PlugInNamespace。它表示要&amp;#8220;plugged-in&amp;#8221;到哪个文档集合中去。当使用 h2reg.exe 部署您的帮助文档时，它们被插接到 VS.NET 的合并文档集合中去。默认值 ms.vscc 指示 h2reg.exe 自动判断 VS.NET 是 2002 或 2003 版本。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;筛选器&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　每个帮助主题的 XML 数据岛中可以包含一个或多个 DocSet 值。在文档资源管理器及 VS.NET IDE 中，这些 DocSet 值常常被各个筛选器用于筛选帮助索引及搜索范围。&lt;/p&gt;&#xD;
&lt;p &gt;默认的一些筛选器定义如下:&lt;/p&gt;&#xD;
&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#ffff99"&gt;Windows Client SDK, 　　Query: "DocSet"="WCSDK"&lt;br /&gt;.NET Framework, 　　　　Query: ("DocSet"="NETFramework" OR "DocSet" = "NETFrameworkExtender") OR (("DocSet"="C#" OR "DocSet"="Visual Basic" OR "DocSet"="Visual C++" OR "DocSet"="VBA" OR "DocSet"="VJ#" OR "DocSet"="Visual Studio") AND "Technology"="ManagedCode")&lt;br /&gt;Visual Studio 宏, 　　　Query: "DocSet" = "VSM" OR "DocSet" = "NETFramework"&lt;br /&gt;Visual Basic, 　　　　　Query: "DocSet" = "Visual Basic" OR "DocSet" = "NETFramework" OR "DocSet" = "NETFrameworkExtender" OR "DocSet" = "DHTML" OR "DocSet" = "XML" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "kbVBp700")&lt;br /&gt;Visual C++, 　　　　　　Query: "DevLang" = "C" OR "DevLang" = "C++" OR "Product" = "VC" OR "DocSet" = "PSDK" OR "DocSet" = "NETFramework" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "kbVC700")&lt;br /&gt;Platform SDK, 　　　　　Query: "DocSet" = "PSDK"&lt;br /&gt;(no filter), 　　　　　Query: &lt;br /&gt;企业级服务器, 　　　　Query: "DocSet" = "NETEnterpriseServers" OR "DocSet" = "SQL Server"&lt;br /&gt;Internet 开发,　　　　Query: "DocSet" = "DHTML" OR "DocSet" = "XML" OR "DevLang" = "DHTML" OR "DevLang" = "HTML" OR "DevLang" = "VBScript" OR "DevLang" = "JScript" OR "DevLang" = "ASP" OR "Technology" = "kbSOAP" OR "Technology" = "ASPNET" OR "Technology" = "HPS"&lt;br /&gt;Visual Studio, 　　　Query: "DocSet" = "Visual Studio" OR "DocSet" = "Visual Studio SDK" OR "DocSet" = "CrystalReports" OR "DocSet" = "Visual Source Safe" OR "DocSet" = "VSAnalyzer" OR "DocSet" = "PSDK" OR "DocSet" = "NETFramework" OR "DocSet" = "NETFrameworkExtender" OR "DocSet" = "NETEnterpriseServers" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "kbVS700")&lt;br /&gt;Visual C#, 　　　　　Query: "DocSet" = "C#" OR "DocSet" = "NETFramework" OR "DocSet" = "NETFrameworkExtender" OR "DocSet" = "DHTML" OR "DocSet" = "XML" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "C#")&lt;br /&gt;Samples, Query: "TopicType"="kbSampleProd"&lt;br /&gt;Visual FoxPro, 　　　Query: "DocSet" = "Visual FoxPro" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "kbVFP700")&lt;br /&gt;Knowledge Base, 　　Query: "DocSet" = "kbKB"&lt;br /&gt;Visual J#,　　　　 　Query: "DocSet" = "VJ#" OR "DocSet" = "NETFramework" OR "DocSet" = "NETFrameworkExtender" OR "DocSet" = "DHTML" OR "DocSet" = "XML" OR ("DocSet" = "kbmsdn" AND "ProductVers" = "VJ#")&lt;br /&gt;.NET Framework 精简版, Query: "DocSet"="Smart Devices" OR "DocSet"="NetCompactFramework"&lt;br /&gt;中文(简体)文档,　　　 Query: ("Locale"="kbChineseSimp")&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;将您的帮助集合加入上面这些筛选器的搜索范围，可以很简单的指定文档引擎的 DocSetList 配置项。它是一个逗号分隔的字符串，每一项最终都被写成 XML 数据岛中的一行 DocSet 值。当用户使用这些筛选器时，如果您的帮助页面 XML 数据岛中具有特定的 DocSet 值，您的帮助文档就会被包括在搜索范围中。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 默认将 HtmlHelpName 作为一行 DocSet 值写入每页的 XML 数据岛。您不需要通过 DocSetList 重复定义它。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 默认会注册一个新的筛选器，这个筛选器的查询条件是 "DocSet" = "HtmlHelpName"，即这个筛选器将只搜索这个帮助集合的内容。Microsoft Help 2 允许您定义其他自定义的筛选器，但已经超出 NDoc 的工作范围，您需要自行查阅 VSHIK 文档，修改 Microsoft Help 2 项目文件重新编译。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="613"&gt;&lt;/a&gt;&lt;strong&gt;部署 Microsoft Help 2&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　Microsoft Help 2 帮助系统维护一个注册表(不要和 Windows 注册表混淆)，保存当前机器中所有已安装的帮助集合。注册表保存了所有的帮助集合，每个帮助集合中包含的 Help Titles，帮助集合间的嵌套关系等。&lt;/p&gt;&#xD;
&lt;p &gt;查看 Microsoft Help 2 Title 或集合之前，必须首先注册。因此 Microsoft Help 2 文档的部署，要比 HTML Help 1 的简单文件拷贝复杂的多。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Windows Installer&lt;/strong&gt;&lt;br /&gt;　可以通过创建一个 Windows Installer 安装包程序，用于部署并注册帮助集合和 Help Titles。VSHIK 文档中有具体的制作步骤。不幸的是，这个过程中有很多手工的步骤，我们还没有能够找到自动制作 Windows Installer 安装包的方法。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;H2Reg&lt;/strong&gt;&lt;br /&gt;　另一格选择是使用 helpware.net 提供的 共享软件 H2Reg.exe。H2Reg.exe 是一个命名行工具，可以在安装过程中使用它，完成帮助集合/Help Title 的注册。它可以被用于任何支持命令行的安装程序，比如对于 Windows Installer 安装包，H2Reg 可以作为一个自定义动作。&lt;/p&gt;&#xD;
&lt;p &gt;如果设置 GenerateCollectionFiles 为 true，NDoc 会为 H2Reg 创建特定的 INI 配置文件，H2Reg 可以根据这个 INI 配置文件完成 Help Title 的注册、并合并到 VS.NET 的合并文档集合等动作。(记得将这个 INI 配置文件包含进您的安装包。)&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;下面是完整的步骤:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&lt;li &gt;设置文档引擎的 GenerateCollectionFiles 为 true&lt;/li&gt;&lt;li &gt;将编译生成的帮助文件(*.HxS, *.HxI 等)，和生成的 INI 文件包含到安装包中。&lt;/li&gt;&lt;li &gt;将 H2Reg.exe 和 H2Reg.ini (此文件可以从 H2Reg 安装路径中拷贝出来)包含到安装包中。&lt;/li&gt;&lt;li &gt;配置安装包，让安装包安装时，将帮助文件和生成的 INI 文件复制到安装路径下。&lt;/li&gt;&lt;li &gt;安装动作：执行 H2Reg，语法为: &lt;br /&gt;H2reg -r "CmdFile=&amp;lt;生成的 INI 文件的完整路径&amp;gt;"&lt;/li&gt;&lt;li &gt;卸载动作：执行 H2Reg，语法为: &lt;br /&gt;H2reg -u "CmdFile=&amp;lt;生成的 INI 文件的完整路径&amp;gt;" &lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;p &gt;注意: 先执行 H2Reg，再删除相应的帮助文件和 INI 文件。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a id="71" name="71"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　MSDN 文档引擎用于生成如 .NET Framework SDK 类库文档样式的代码文档，并编译为 HTML Help 1 格式的单一文件(*.CHM)。&lt;/p&gt;&#xD;
&lt;p &gt;MSDN 2003 文档引擎是 NDoc 1.3 对 MSDN 文档引擎的改进，加入了语言选择器等功能，更加接近 .NET Framework SDK 文档的样式。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;　所有文档引擎都具有一些 通用的配置项。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="21%"&gt;&lt;strong&gt;配置项 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="79%"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;AdditionalContentResourceDirectory&lt;/td&gt;&#xD;
&lt;td &gt;页面中涉及到的资源文件（如图片等）所在的目录。此目录及其子目录中的所有文件，将以原有的目录结构包含进 HTML Help 项目中，使用相对路径的超链接不需要做大的调整。 &lt;br /&gt;注意: 此文件夹中第一层次的文件，和 NDoc 生成的 HTML 文件、以及通过 FilesToInclude 包含进来的文件，将处在同一层次上，请依次类推其他文件的相对 URL。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;BinaryTOC&lt;/td&gt;&#xD;
&lt;td &gt;是否以二进制方式创建目录树文件。这将显著提高大尺寸 CHM 文件的打开速度。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ExtensibilityStylesheet&lt;/td&gt;&#xD;
&lt;td &gt;用户自定义的 NDoc 扩展 XSLT 转换文件，用于转换用户自定义的特殊标记。请参见 NDoc 可扩展性。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;FilesToInclude &lt;/td&gt;&#xD;
&lt;td &gt;指定需要包含在 HTML Help 项目中的附加文件。(1)允许使用绝对路径或相对路径指定，相对路径相对于 NDoc 项目文件所在目录。(2)可以使用通配符 * 和 ?，如 D:\preparedDocs\*.html。(3)可以有多个地址，用符号 "|" 隔开。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;FooterHtml &lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;自定义的 HTML 页脚。您可以直接使用 HTML 代码，其中: "%FILE_NAME%" 将被自动替换为页面的文件名，"%TOPIC_TITLE%" 被替换为该页面的标题文字，"%ASSEMBLY_NAME%" 和 "%ASSEMBLY_VERSION%" 分别被替换为当前页面对应类型所属程序集的名称和版本信息。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;HeaderHtml &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;自定义的 HTML 页头。您可以直接使用 HTML 代码，其中: "%FILE_NAME%" 将被自动替换为页面的文件名，"%TOPIC_TITLE%" 则被替换为该页面的标题文字。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;HtmlHelpName &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;一个名称，用于命名生成的 HTML Help 项目以及将要生成的 CHM 文件。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;IncludeFavorites &lt;/td&gt;&#xD;
&lt;td &gt;是否在生成的 HTML Help 文件中包含&amp;#8220;收藏&amp;#8221;选项卡。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;LangID HTML Help &lt;/td&gt;&#xD;
&lt;td &gt;文件的 LangID 设置。中文版默认为 2052。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;OutputDirectory &lt;/td&gt;&#xD;
&lt;td &gt;输出文件目录，生成的 .html 和 .chm 文件都将存放于此目录。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;OutputTarget&lt;/td&gt;&#xD;
&lt;td &gt;输出目标格式: HTML Help (.chm) 或 Web 网页或两者都输出。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;RootPageContainsNamespaces &lt;/td&gt;&#xD;
&lt;td &gt;如果为真，RootPageFileName指定的主页面，将在目录树中表示为所有命名空间结点的容器（父结点）。否则，将和其他命名空间结点并列表示。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&lt;br /&gt;RootPageFileName&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td &gt;通过此项指定 HTML Help 文件中的主页面文件名。注：此处主页指打开 CHM 文件时显示的第一个页面，请通过 RootPageTOCName 指定此主页面在目录树中的显示名称；通过 RootPageContainsNamespaces 指定此主页面在目录树中的显示样式；可以通过 FilesToInclude 将此文件引入到此 HTML Help 项目中来。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;RootPageTOCName &lt;/td&gt;&#xD;
&lt;td &gt;HTML Help 文件中，主页在目录树中的显示名称。若 RootPageFileName 指定了某一页面，而此项没有指定，则将在目录树中显示&amp;#8220;概述&amp;#8221;作为名称。注：此处主页指打开 CHM 文件时显示的第一个页面。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SdkLinksOnWeb &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;如果为真，类库中所有指向 .NET Framework 标准类库的文档超链接都将指向 MSDN 的在线版本。否则，将指向本地版本。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;ShowVisualBasic &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;是否为类型和成员显示 Visual Basic 语法块。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Title &lt;/td&gt;&#xD;
&lt;td &gt;此文本将显示在每个页面的左上角，一般填写类库的名称比较合适。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;将附加的文件加入要编译的 CHM 文件中&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　MSDN 文档引擎提供了 FilesToInclude 和 AdditionalContentResourceDirectory 两种途径，允许您附加额外的文件。 &lt;/p&gt;&#xD;
&lt;p &gt;前者允许您使用 * 或 ? 通配符的形式指定要包含的文件路径，可以指定多个路径，用&amp;#8220;|&amp;#8221;隔开。如果使用相对路径，应相对于 NDoc 项目文件所在的目录。注意：在最终编译的 CHM 中，这些被附加的文件，和其他由 NDoc 生成的 HTML 文件，处在同一级目录中。&lt;/p&gt;&#xD;
&lt;p &gt;后者将一个文件夹中的内容(包括子文件夹中的全部内容)全部读入。注意：在最终编译的 CHM 中，AdditionalContentResourceDirectory 文件夹第一级的文件和文件夹，和其他由 NDoc 生成的 HTML 文件，处在同一级目录中；该目录的子目录及其中内容，将保持原有父子关系。例如 AdditionalContentResourceDirectory 是 D:\temp ，这个目录中有 my.css 文件和 images 子目录，images 目录中有 logo.gif 文件，则 my.css 和其他 NDoc 生成的文件同级，使用相对路径引用 my.css 时为&amp;#8220;my.css&amp;#8221;；而引用 logo.gif 应为&amp;#8220;images/logo.gif&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p &gt;请根据您的具体情况进行选择具体采用哪种方式。&lt;/p&gt;&#xD;
&lt;p &gt;另外，RootPageFileName 指定 CHM 打开时的第一个页面文件，这个页面可以是 NDoc 生成的文件，也可以是通过上述两种方式附加进去的某 HTML 文件。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="81"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　MSDN 2003 文档引擎是 NDoc 1.3 对 MSDN 文档引擎的改进，加入了语言选择器等功能，更加接近 .NET Framework SDK 文档的样式。它用于生成如 .NET Framework SDK 类库文档样式的代码文档，并编译为 HTML Help 1 格式的单一文件(*.CHM)。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;　所有文档引擎都具有一些 通用的配置项。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="20%"&gt;配置项&lt;/td&gt;&#xD;
&lt;td  width="80%"&gt;说明 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&lt;br /&gt;AdditionalContentResourceDirectory &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td &gt;页面中涉及到的资源文件（如图片等）所在的目录。此目录及其子目录中的所有文件，将以原有的目录结构包含进 HTML Help 项目中，使用相对路径的超链接不需要做大的调整。 &lt;br /&gt;注意: 此文件夹中第一层次的文件，和 NDoc 生成的 HTML 文件、以及通过 FilesToInclude 包含进来的文件，将处在同一层次上，请依次类推其他文件的相对 URL。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;BinaryTOC&lt;/td&gt;&#xD;
&lt;td &gt;是否以二进制方式创建目录树文件。这将显著提高大尺寸 CHM 文件的打开速度。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&lt;br /&gt;ExtensibilityStylesheet&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td &gt;用户自定义的 NDoc 扩展 XSLT 转换文件，用于转换用户自定义的特殊标记。请参见 NDoc 可扩展性。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&lt;br /&gt;FilesToInclude &lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td &gt;指定需要包含在 HTML Help 项目中的附加文件。(1)允许使用绝对路径或相对路径指定，相对路径相对于 NDoc 项目文件所在目录。(2)可以使用通配符 * 和 ?，如 D:\preparedDocs\*.html。(3)可以有多个地址，用符号 "|" 隔开。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;FooterHtml&lt;/td&gt;&#xD;
&lt;td &gt;自定义的 HTML 页脚。您可以直接使用 HTML 代码，其中: "%FILE_NAME%" 将被自动替换为页面的文件名，"%TOPIC_TITLE%" 被替换为该页面的标题文字，"%ASSEMBLY_NAME%" 和 "%ASSEMBLY_VERSION%" 分别被替换为当前页面对应类型所属程序集的名称和版本信息。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&lt;span &gt;&lt;br /&gt;HeaderHtml &lt;/span&gt;&lt;/td&gt;&#xD;
&lt;td &gt;自定义的 HTML 页头。您可以直接使用 HTML 代码，其中: "%FILE_NAME%" 将被自动替换为页面的文件名，"%TOPIC_TITLE%" 则被替换为该页面的标题文字。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;HtmlHelpName&lt;/td&gt;&#xD;
&lt;td &gt;一个名称，用于命名生成的 HTML Help 项目以及将要生成的 CHM 文件。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;IncludeFavorites&lt;/td&gt;&#xD;
&lt;td &gt;是否在生成的 HTML Help 文件中包含&amp;#8220;收藏&amp;#8221;选项卡。 &lt;br /&gt;LangID HTML Help 文件的 LangID 设置。中文版默认为 2052。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;OutputDirectory &lt;/td&gt;&#xD;
&lt;td &gt;输出文件目录，生成的 .html 和 .chm 文件都将存放于此目录。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;OutputTarget &lt;/td&gt;&#xD;
&lt;td &gt;输出目标格式: HTML Help (.chm) 或 Web 网页或两者都输出。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;RootPageContainsNamespaces&lt;/td&gt;&#xD;
&lt;td &gt;如果为真，RootPageFileName 指定的主页面，将在目录树中表示为所有命名空间结点的容器（父结点）。否则，将和其他命名空间结点并列表示。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;RootPageFileName &lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;通过此项指定 HTML Help 文件中的主页面文件名。注：此处主页指打开 CHM 文件时显示的第一个页面，请通过 RootPageTOCName 指定此主页面在目录树中的显示名称；&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;RootPageContainsNamespaces&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;指定此主页面在目录树中的显示样式；可以通过 FilesToInclude 将此文件引入到此 HTML Help 项目中来。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;RootPageTOCName &lt;/td&gt;&#xD;
&lt;td &gt;HTML Help 文件中，主页在目录树中的显示名称。若 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;RootPageFileName &lt;/td&gt;&#xD;
&lt;td &gt;指定了某一页面，而此项没有指定，则将在目录树中显示&amp;#8220;概述&amp;#8221;作为名称。注：此处主页指打开 CHM 文件时显示的第一个页面。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;SdkLinksOnWeb&lt;/td&gt;&#xD;
&lt;td &gt;如果为真，类库中所有指向 .NET Framework 标准类库的文档超链接都将指向 MSDN 的在线版本。否则，将指向本地版本。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Title &lt;/td&gt;&#xD;
&lt;td &gt;此文本将显示在每个页面的左上角，一般填写类库的名称比较合适。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;将附加的文件加入要编译的 CHM 文件中&lt;/strong&gt;&lt;br /&gt;　MSDN 文档引擎提供了 FilesToInclude 和 AdditionalContentResourceDirectory 两种途径，允许您附加额外的文件。 &lt;/p&gt;&#xD;
&lt;p &gt;前者允许您使用 * 或 ? 通配符的形式指定要包含的文件路径，可以指定多个路径，用&amp;#8220;|&amp;#8221;隔开。如果使用相对路径，应相对于 NDoc 项目文件所在的目录。注意：在最终编译的 CHM 中，这些被附加的文件，和其他由 NDoc 生成的 HTML 文件，处在同一级目录中。&lt;/p&gt;&#xD;
&lt;p &gt;后者将一个文件夹中的内容(包括子文件夹中的全部内容)全部读入。注意：在最终编译的 CHM 中，AdditionalContentResourceDirectory 文件夹第一级的文件和文件夹，和其他由 NDoc 生成的 HTML 文件，处在同一级目录中；该目录的子目录及其中内容，将保持原有父子关系。例如 AdditionalContentResourceDirectory 是 D:\temp ，这个目录中有 my.css 文件和 images 子目录，images 目录中有 logo.gif 文件，则 my.css 和其他 NDoc 生成的文件同级，使用相对路径引用 my.css 时为&amp;#8220;my.css&amp;#8221;；而引用 logo.gif 应为&amp;#8220;images/logo.gif&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p &gt;请根据您的具体情况进行选择具体采用哪种方式。&lt;/p&gt;&#xD;
&lt;p &gt;另外，RootPageFileName 指定 CHM 打开时的第一个页面文件，这个页面可以是 NDoc 生成的文件，也可以是通过上述两种方式附加进去的某 HTML 文件。 &lt;br /&gt;　&lt;br /&gt;　 &lt;a name="91"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　XML 文档引擎是 NDoc 中最简单的文档引擎，它直接输出 NDoc 生成的中间 XML 文件。主要帮助开发人员调试 NDoc 扩展 XSLT 转换，以及制作新的自定义文档引擎。&lt;/p&gt;&#xD;
&lt;p &gt;请参见 NDoc 可扩展性 和 实现一个新的文档引擎。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;　所有文档引擎都具有一些 通用的配置项。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="21%"&gt;&lt;strong&gt;配置项 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="79%"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;OutputFile&lt;/td&gt;&#xD;
&lt;td &gt;输出 XML 文件名。XML 文档引擎输出 NDoc 文档生成器所使用的中间 XML 格式数据，适用于自定义文档引擎的制作与调试。 &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;a name="101"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　JavaDoc 文档引擎用于创建类似 JavaDoc (Java 社区中，自动创建代码文档的工具) 布局和格式的 HTML 代码文档。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;因为缺少足够的关注度，此文档引擎的开发并不活跃。 如果您有兴趣进一步完善此文档引擎，请联络 NDoc 项目管理员。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;　所有文档引擎都具有一些 通用的配置项。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="22%"&gt;&lt;strong&gt;配置项 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="78%"&gt;&lt;strong&gt;说明&lt;/strong&gt; &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Title JavaDoc &lt;/td&gt;&#xD;
&lt;td &gt;项目标题。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;OutputDirectory &lt;/td&gt;&#xD;
&lt;td &gt;存放输出 HTML 文件的文件夹。&lt;br /&gt;可以为绝对路径或者相对于 NDoc 项目文件的相对路径。 &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="111"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　Linear HTML 文档引擎用于生成单一 HTML 文件的代码文档。 &lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;　所有文档引擎都具有一些 通用的配置项。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="20%"&gt;&lt;strong&gt;配置项 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="80%"&gt;&lt;strong&gt;说明 &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;OutputDirectory&lt;/td&gt;&#xD;
&lt;td &gt;目标 HTML 文件的输出目录。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;Title&lt;/td&gt;&#xD;
&lt;td &gt;HTML 页的标题。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;IncludeTypeMemberDetails&lt;/td&gt;&#xD;
&lt;td &gt;是否输出类型成员的细节（如：是否显示字段、属性的&amp;#8220;备注&amp;#8221;等，是否单独显示方法的参数表格） &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;MethodParametersInTable &lt;/td&gt;&#xD;
&lt;td &gt;是否在同一表格中显示方法的参数列表。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;TypeIncludeRegexp &lt;/td&gt;&#xD;
&lt;td &gt;一个正则表达式，设置此项可以过滤类型的输出，只有符合正则表达式的类型被输出。留空白则输出全部。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;amespaceExcludeRegexp&lt;/td&gt;&#xD;
&lt;td &gt;一个正则表达式，设置此项可以过滤命名空间的输出，符合正则表达式的命名空间被过滤。留空白则关闭过滤。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="121"&gt;&lt;/a&gt;&lt;strong&gt;概述&lt;/strong&gt;&lt;br /&gt;　LaTeX 文档引擎用于创建 dvi、pdf、postscript 等 LaTeX 格式的代码文档。&lt;/p&gt;&#xD;
&lt;p &gt;您需要安装一个 LaTeX 编译器，比如免费的 MiKTeX。关于 LaTeX 的中文支持问题，请参见 CTeX: 中文 TeX 网站 中的相关内容。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;配置&lt;/strong&gt;&lt;br /&gt;　所有文档引擎都具有一些 通用的配置项。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="22%"&gt;&lt;strong&gt;配置项&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="78%"&gt;&lt;strong&gt;说明 &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;OutputDirectory&lt;/td&gt;&#xD;
&lt;td &gt;文件输出目录。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;LatexCompiler LaTeX&lt;/td&gt;&#xD;
&lt;td &gt;编译器路径。(如果您没有安装 LaTeX 编译器，请保持空白。) &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;TexFileBaseName &lt;/td&gt;&#xD;
&lt;td &gt;目标 LaTeX 文件名，请不要加扩展名。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p&gt;&lt;span &gt;&lt;a name="7"&gt;&lt;/a&gt;NDoc 内置的 MSDN, MSDN 2003, VS.NET 文档引擎，支持 C# 程序员参考中的所有 XML 文档注释标记。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 支持扩充的标记和语法。某些标记只能用于特定的类型（类，结构，委托，接口，枚举）或成员（字段，属性，方法，事件等），请参见标记用法。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 将标记区分为三类: Section 标记，Block 标记，Inline 标记。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Section 标记&lt;/strong&gt;&lt;br /&gt;　Section 标记用于定义不同的代码文档的区域。它们都是顶级标记，Block 标记、Inline 标记都应包含在某个 Section 标记的内部。（除非自定义了扩展 XSLT 转换，否则，在 Section 标记外部的 Block 标记或 Inline 标记都被忽略。）&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="19%"&gt;&lt;strong&gt;标记 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="81%"&gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;event&amp;gt;[NDoc 扩充]&lt;/td&gt;&#xD;
&lt;td &gt;对某个成员可能引发的事件的说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;example&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;示例&amp;#8221;，帮助类库使用者理解类型/成员使用方法的示例代码。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;exception&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;对某个成员可以抛出的异常的说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;exclude/&amp;gt;[NDoc 扩充]&lt;/td&gt;&#xD;
&lt;td &gt;指示 NDoc 文档引擎将被标记的类型/成员排除在代码文档之外。与文档引擎的&amp;#8220;可见性&amp;#8221;配置不符的，以 exclude 优先。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;include&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;将代码文件外部的某 XML 文件中的一部分包含进代码文件来。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;overloads&amp;gt; [NDoc 扩充]&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;为&amp;#8220;重载列表&amp;#8221;页面准备摘要、备注、示例等文档内容。只需在重载成员的第一个成员前面书写此区域即可。 &lt;/span&gt;&#xD;
&lt;p &gt;&amp;lt;overloads&amp;gt; 标记有两种形式:&lt;/p&gt;&#xD;
&lt;p &gt;简单的形式，直接在 overload 中写文本，这些文本被处理为&amp;#8220;重载列表&amp;#8221;页面的摘要。没有备注、示例等区域。 &lt;br /&gt;复杂的形式，在 overload 内部，包含 summary, remarks, example 等标记分别表示&amp;#8220;重载列表&amp;#8221;页面的摘要、备注、示例等。 &lt;br /&gt;示例:&lt;/p&gt;&lt;span &gt;///&amp;lt;overloads&amp;gt;This method has two overloads.&amp;lt;/overloads&amp;gt;&lt;br /&gt;///&amp;lt;summary&amp;gt;This overload just says hello.&amp;lt;/summary&amp;gt;&lt;br /&gt;public void SayHello() { ... }&lt;br /&gt;///&amp;lt;summary&amp;gt;This one says hello to someone.&amp;lt;/summary&amp;gt;&lt;br /&gt;public void SayHello(string toSomeone) { ... }&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;param&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;成员的参数说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;permission&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;访问某成员所必需的 .NET Framework 安全性 CodeAccessPermission。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;preliminary&amp;gt; [NDoc 扩充]&lt;/td&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p &gt;&lt;br /&gt;将某类型/成员标记为&amp;#8220;预发布&amp;#8221;。内部的文本被当作警告文本用红色显示，可以包含 &amp;lt;para&amp;gt; 表示多行文本。如果缺少内部文本，则显示默认的警告文本: &amp;#8220;[此文档为预发布版本，在未来版本中有可能改变。]&amp;#8221;。 &lt;/p&gt;&#xD;
&lt;p &gt;如果需要把全部类型/成员都标记为&amp;#8220;预发布&amp;#8221;，请使用文档引擎的 Preliminary 配置项。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;remarks&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;备注&amp;#8221;，对 &amp;lt;summary&amp;gt; 的进一步注解。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;returns&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;返回值&amp;#8221;。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;seealso&amp;gt; &lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;向页面的&amp;#8220;请参见&amp;#8221;区域添加一个链接。 &lt;/span&gt;&#xD;
&lt;p &gt;请不要将此标记包含在 &amp;lt;remarks&amp;gt; 内部，它是一个顶级标记。&lt;/p&gt;&#xD;
&lt;p &gt;两种可选的语法:&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;seealso href="http://www.microsoft.com/china/msdn/"&amp;gt;MSDN(CHS)&amp;lt;/seealso&amp;gt; &lt;br /&gt;&amp;lt;seealso cref="System.Data.DataSet"&amp;gt;DataSet&amp;lt;/seealso&amp;gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;summary&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;摘要&amp;#8221;，对类型/成员的摘要说明。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;threadsafety&amp;gt;[NDoc 扩充]&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;#8220;线程安全&amp;#8221;，说明类型在多线程环境中是否安全。 &lt;/span&gt;&#xD;
&lt;p &gt;NDoc 提供 static 和 instance 两个布尔的属性，可以自动生成像 .NET Framework SDK 类库文档中那样的标准文本。&lt;/p&gt;&#xD;
&lt;p &gt;threadsafety 标记内部可以包含额外的文本，会被显示到标准文本的下方，说明额外的信息。例如:&lt;/p&gt;&lt;span &gt;/// &amp;lt;summary&amp;gt;The summary description for SafeClass.&amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;threadsafety static="true" instance="true"&amp;gt;&lt;br /&gt;/// &amp;lt;para&amp;gt;More information about using this class across thread&amp;lt;/para&amp;gt;&lt;br /&gt;/// &amp;lt;/threadsafety&amp;gt;&lt;br /&gt;public class SafeClass() { ... }&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;value&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;属性值&amp;#8221;。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Block 标记&lt;/strong&gt;&lt;br /&gt;　Block 标记用于 Section 标记的内部，它们将显示在单独的行中。&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="20%"&gt;&lt;strong&gt;标记 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="80%"&gt;&lt;strong&gt;说明 &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;code&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;多行的代码块。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;list&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;一个列表或表格。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;note&amp;gt;[NDoc 扩充]&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;&amp;#8220;注意&amp;#8221;块。 &lt;/span&gt;&#xD;
&lt;p &gt;例如:&lt;/p&gt;&#xD;
&lt;p &gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// &amp;lt;note&amp;gt;This is a note in the summary.&amp;lt;/note&amp;gt;&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public class SomeClass() { ... }&lt;br /&gt;将生成:&lt;/p&gt;&#xD;
&lt;p &gt;注意 This is a note in the summary.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;para&amp;gt;&lt;/td&gt;&#xD;
&lt;td &gt;表示一个段落。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;strong&gt;Inline 标记&lt;/strong&gt;&lt;br /&gt;　Inline 标记可以用于其他 Section 标记或 Block 标记内部，它们将和前后的文本显示在同一行中。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="20%"&gt;&lt;strong&gt;标记 &lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td  width="80%"&gt;&lt;strong&gt;说明 &lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;c&amp;gt;&lt;br /&gt;&lt;/td&gt;&#xD;
&lt;td &gt;将内部文本格式化为代码样式，用于表示行文中提到的短小代码片段。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;paramref&amp;gt; &lt;/td&gt;&#xD;
&lt;td &gt;加入指向方法参数的链接。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&amp;lt;see&amp;gt;&lt;/td&gt;&#xD;
&lt;td&gt;&lt;span &gt;加入指向某个类型/成员或网络 URL 的链接。 &lt;/span&gt;&#xD;
&lt;p &gt;两种可选的语法:&lt;/p&gt;&lt;span &gt;&amp;lt;see href="http://www.microsoft.com/china/msdn/"&amp;gt;MSDN(CHS)&amp;lt;/see&amp;gt; &lt;br /&gt;&amp;lt;see cref="System.Data.DataSet"&amp;gt;DataSet&amp;lt;/see&amp;gt; &lt;br /&gt;&amp;lt;see langword="xxx"/&amp;gt;&lt;br /&gt;其中 xxx 可以是 null, sealed, static, abstract 或 virtual。 &lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="711"&gt;&lt;/a&gt;下面的表格显示了各 block 标记的有效性。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/070227.JPG" width="956" height="450"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;　&lt;a name="712"&gt;&lt;/a&gt;&amp;lt;c&amp;gt; 标记指示将其内部的文本表示为代码样式，Inline 标记，用于表示行文中的代码片断。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;c&amp;gt;text&amp;lt;/c&amp;gt;&lt;br /&gt;　其中:&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;text&lt;/strong&gt; &lt;br /&gt;　要标记为代码样式的文本。 &lt;br /&gt;　应用于&lt;br /&gt;　可用于其他标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;br /&gt;　如果需要标记多行的代码块，请使用 &amp;lt;code&amp;gt; 标记。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;　[C#]&lt;br /&gt;　public class MyClass &lt;br /&gt;　{&lt;br /&gt;　/// &amp;lt;summary&amp;gt;&lt;br /&gt;　/// &amp;lt;c&amp;gt;MyMethod&amp;lt;/c&amp;gt; is a method in the &amp;lt;c&amp;gt;MyClass&amp;lt;/c&amp;gt; class.&lt;br /&gt;　/// &amp;lt;/summary&amp;gt;&lt;br /&gt;　public static void MyMethod(int Int1) &lt;br /&gt;　{&lt;br /&gt;　}&lt;br /&gt;　}&lt;br /&gt;&lt;br /&gt;　&lt;a name="713"&gt;&lt;/a&gt; &amp;lt;code&amp;gt; 标记指示将其内部的文本表示为代码样式，Block 标记，用于表示多行的代码块。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;code [lang="language"][escaped="true"]&amp;gt;content&amp;lt;/code&amp;gt;&lt;br /&gt;　其中:&lt;/p&gt;&#xD;
&lt;p &gt;lang="language" [NDoc 扩充] &lt;br /&gt;　语言选择器，表示此代码块仅适用于某种编程语言。(可选) &lt;br /&gt;　escaped="true" [NDoc 扩充] &lt;br /&gt;　若 content 中含有 XML 子级，将它们视为代码的一部分。注意：content 仍然需要是格式完好的 XML。(可选) &lt;br /&gt;　content &lt;br /&gt;　将被表示为代码块的文本。 &lt;br /&gt;　应用于&lt;br /&gt;　可用于其他 Section 标记或 Block 标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;　使用 lang 属性表示语言选择器，标准的语言有: Visual Basic, C#, C++ 及 JScript。若代码块适用于多种语言，则用逗号隔开，比如&amp;#8220;Visual Basic, C#, C++&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p &gt;escaped 为 true 时，其内部所有其他标记都被转义为代码块的一部分。&lt;/p&gt;&#xD;
&lt;p &gt;注意 content 内容必须是格式完好的 XML 注释。否则整个注释块可能被忽略或出错!!!&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;　下面示例中，因为 escaped="true"，因此直接写入了要作为代码块的 XML 内容。 Note how, in the following comments, the xml text can entered verbatim because the escaped="true" attribute has been applied.&lt;/p&gt;&#xD;
&lt;p &gt;[C#]&lt;br /&gt;　/// &amp;lt;summary&amp;gt;&lt;br /&gt;　/// Loads the XML.&lt;br /&gt;　/// &amp;lt;/summary&amp;gt;&lt;br /&gt;　/// &amp;lt;example&amp;gt; The XML should have the following format.&lt;br /&gt;　/// &amp;lt;code escaped="true"&amp;gt;&lt;br /&gt;　/// &amp;lt;root&amp;gt;&lt;br /&gt;　/// &amp;lt;member name="name"/&amp;gt;&lt;br /&gt;　/// &amp;lt;/root&amp;gt;&lt;br /&gt;　/// &amp;lt;/code&amp;gt;&lt;br /&gt;　/// &amp;lt;/example&amp;gt;&lt;br /&gt;　public void LoadXml(string xml) &lt;br /&gt;　{&lt;br /&gt;　//do something here...&lt;br /&gt;　}&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="714"&gt;&lt;/a&gt;&amp;lt;event&amp;gt; 标记用于说明被标记的方法可能引发的事件。Section 标记。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;event cref="member"&amp;gt;description&amp;lt;/event&amp;gt;&lt;br /&gt;　其中:&lt;/p&gt;&#xD;
&lt;p &gt;cref = "member" &lt;br /&gt;　表示可能引发的事件。书写时，如果可能引发的事件是同一类型的事件，member 可以直接写事件名称（注意大小写）；如果是其他类型的，建议您写该事件的完全限定名称。C# 编译器将检查该事件是否存在。在输出的 XML 文档文件中，C# 编译器会自动转换简写的 member 为完全限定名称。 &lt;br /&gt;　description &lt;br /&gt;　附加的说明，比如在什么情况下引发该事件。 &lt;br /&gt;　应用于&lt;br /&gt;　方法成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;&lt;br /&gt;　&lt;a name="715"&gt;&lt;/a&gt; &amp;lt;example&amp;gt; 标记表示&amp;#8220;示例&amp;#8221;区域。Section 标记。用于书写能辅助使用者理解并快速上手的示例代码等内容。 &lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;example&amp;gt;description&amp;lt;/example&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;description &lt;br /&gt;示例及其说明。 &lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;此标记经常和 &amp;lt;code&amp;gt; 标记联用。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;public class MyClass &lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// The GetZero method.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;example&amp;gt; This sample shows how to call the GetZero method.&lt;br /&gt;/// &amp;lt;code&amp;gt;&lt;br /&gt;/// class MyClass &lt;br /&gt;/// {&lt;br /&gt;/// public static int Main() &lt;br /&gt;/// {&lt;br /&gt;/// return GetZero();&lt;br /&gt;/// }&lt;br /&gt;/// }&lt;br /&gt;/// &amp;lt;/code&amp;gt;&lt;br /&gt;/// &amp;lt;/example&amp;gt;&lt;br /&gt;public static int GetZero() &lt;br /&gt;{&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;a name="716"&gt;&lt;/a&gt;&amp;lt;exception&amp;gt; 标记用于说明一个成员可能抛出的异常。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;exception cref="member"&amp;gt;description&amp;lt;/exception&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;cref = "member" &lt;br /&gt;表示可能抛出的异常类型。书写时，如果可能抛出的异常是同一命名空间下的异常类型，member 可以直接写异常名称（注意大小写）；如果是其他命名空间的，建议您写该异常类型的完全限定名称。C# 编译器将检查该异常是否存在。在输出的 XML 文档文件中，C# 编译器会自动转换简写的 member 为完全限定名称。 &lt;br /&gt;description &lt;br /&gt;说明信息，比如在什么情况下抛出该异常。 &lt;br /&gt;应用于&lt;br /&gt;属性, 方法, 事件, 运算符, 类型转换&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;using System;&lt;/p&gt;&#xD;
&lt;p &gt;/// comment for class&lt;br /&gt;public class EClass : Exception &lt;br /&gt;{&lt;br /&gt;// class definition ...&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;class TestClass &lt;br /&gt;{&lt;br /&gt;/// &amp;lt;exception cref="EClass"&amp;gt;Thrown when... .&amp;lt;/exception&amp;gt;&lt;br /&gt;public static void Main() &lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;throw new EClass();&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="717"&gt;&lt;/a&gt;&amp;lt;exclude/&amp;gt; 标记指示 NDoc 文档引擎将被标记的类型/成员排除在代码文档之外。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;exclude/&amp;gt;&lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;与文档引擎的&amp;#8220;可见性&amp;#8221;配置不符的，以 exclude 优先。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;请参见&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="718"&gt;&lt;/a&gt;&amp;lt;include&amp;gt; 标记指示将代码文件(*.cs)外部的某 XML 文件中的一部分、作为 XML 文档注释、包含进代码文件来。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;include file='filename' path='tagpath[@name="id"]' /&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;filename &lt;br /&gt;包含 XML 文档注释的文件名。该文件名可包含路径。将 filename 括在单引号中 (' ')。 &lt;br /&gt;tagpath &lt;br /&gt;filename 中指向标记名的标记路径（使用 XPath 语法）。将此路径括在单引号中 (' ')。 &lt;br /&gt;name &lt;br /&gt;注释前边的标记中的名称说明符；名称具有一个 id。 &lt;br /&gt;id &lt;br /&gt;位于注释之前的标记的 ID。将此 ID 括在双引号中 (" ")。 &lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;这是除了将文档注释直接置于源代码文件中之外的另一种可选方法。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;include&amp;gt; 标记使用 XML XPath 语法。有关自定义 &amp;lt;include&amp;gt; 使用的方法，请参见 XPath 文档。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;以下是一个多文件示例。第一个文件使用 &amp;lt;include&amp;gt;，如下所列：&lt;/p&gt;&#xD;
&lt;p &gt;[C#]&lt;br /&gt;/// &amp;lt;include file='xml_include_tag.doc' path='MyDocs/MyMembers[@name="test"]/*' /&amp;gt;&lt;br /&gt;class Test&lt;br /&gt;{&lt;br /&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;/// &amp;lt;include file='xml_include_tag.doc' path='MyDocs/MyMembers[@name="test2"]/*' /&amp;gt;&lt;br /&gt;class Test2&lt;br /&gt;{&lt;br /&gt;public void Test()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;第二个文件 xml_include_tag.doc 包含下列文档注释：&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MyDocs&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MyMembers name="test"&amp;gt;&lt;br /&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;The summary for this type.&lt;br /&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;lt;/MyMembers&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;MyMembers name="test2"&amp;gt;&lt;br /&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;The summary for this other type.&lt;br /&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;lt;/MyMembers&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;/MyDocs&amp;gt;&lt;br /&gt;编译器输出的 XML 文档&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;doc&amp;gt;&lt;br /&gt;&amp;lt;assembly&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;t2&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;/assembly&amp;gt;&lt;br /&gt;&amp;lt;members&amp;gt;&lt;br /&gt;&amp;lt;member name="T:Test"&amp;gt;&lt;br /&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;The summary for this type.&lt;br /&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;lt;/member&amp;gt;&lt;br /&gt;&amp;lt;member name="T:Test2"&amp;gt;&lt;br /&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;The summary for this other type.&lt;br /&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;lt;/member&amp;gt;&lt;br /&gt;&amp;lt;/members&amp;gt;&lt;br /&gt;&amp;lt;/doc&amp;gt;&lt;br /&gt;&lt;br /&gt;　&lt;a name="719"&gt;&lt;/a&gt; &amp;lt;list&amp;gt; 标记表示一个列表(数字列表或符号列表)，或一个表格，或一个定义表。Block 标记。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;list type="bullet" | "number" | "table" | "definition"&amp;gt;&lt;br /&gt;&amp;lt;listheader&amp;gt;&lt;br /&gt;&amp;lt;term&amp;gt;term&amp;lt;/term&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;description&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/listheader&amp;gt;&lt;br /&gt;&amp;lt;item&amp;gt;&lt;br /&gt;&amp;lt;term&amp;gt;term&amp;lt;/term&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;description&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;/list&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;term &lt;br /&gt;要定义的项，该项将在 description 中说明/定义。 &lt;br /&gt;description &lt;br /&gt;对 term 的说明/定义。 &lt;br /&gt;备注&lt;br /&gt;&amp;lt;list&amp;gt; 可以表示为四种样式：bullet 为符号列表，即对应于 HTML 中的 UL 列表；number 为数字列表，即对应于 HTML 中的 OL 列表；table 为表格，将以表格形式表示；definition 为定义列表，显示效果就像本页上方&amp;#8220;其中&amp;#8221;二字下面对 term 和 description 的定义那样。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;listheader&amp;gt; 对 table 和 definition 有效。对 table，需要为 term 和 description 两列分别指定列标题。对 definition，需要指定标题文本，如本页上方的&amp;#8220;其中:&amp;#8221;那一行。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;item&amp;gt; 块表示列表中的一项。item 包含子元素 term 和 description。对 bullet 和 number 列表，term 无效也不需要写。对 table 表，可以没有 term，只写 description。对 definition 表，term 和 description 都应该有。&lt;/p&gt;&#xD;
&lt;p &gt;列表可以根据需要包含多个 &amp;lt;item&amp;gt; 块。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;&lt;br /&gt;　&lt;a name="720"&gt;&lt;/a&gt; &amp;lt;note&amp;gt; 标记表示一个&amp;#8220;注意&amp;#8221;块。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;note type="caution" | "inheritinfo" | "implementnotes"&amp;gt;&lt;br /&gt;description&lt;br /&gt;&amp;lt;/note&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;description &lt;br /&gt;注意事项。 &lt;br /&gt;应用于&lt;br /&gt;可用于其他标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;caution 将显示为&amp;#8220;警告&amp;#8221;，inheritinfo 将显示为&amp;#8220;对继承者的说明&amp;#8221;，implementnotes 将显示为&amp;#8220;对实施者的说明&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;&lt;br /&gt;　&lt;a name="721"&gt;&lt;/a&gt; &amp;lt;overloads&amp;gt; 标记为&amp;#8220;重载列表&amp;#8221;页面提供文档。&lt;/p&gt;&#xD;
&lt;p &gt;简单语法&lt;br /&gt;&amp;lt;overloads&amp;gt;&lt;br /&gt;summary_description&lt;br /&gt;&amp;lt;/overloads&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;复合语法&lt;br /&gt;&amp;lt;overloads&amp;gt;&lt;br /&gt;&amp;lt;summary&amp;gt;summary_description&amp;lt;/summary&amp;gt;&lt;br /&gt;[&amp;lt;remarks&amp;gt;remarks_description&amp;lt;/remarks&amp;gt;]&lt;br /&gt;[&amp;lt;example&amp;gt;examples_description&amp;lt;/example&amp;gt;]&lt;br /&gt;&amp;lt;/overloads&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;应用于&lt;br /&gt;属性, 方法, 事件, 运算符。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;只需在重载成员的第一个成员前面书写此区域即可。&lt;/p&gt;&#xD;
&lt;p &gt;此标记有两种形式:&lt;/p&gt;&#xD;
&lt;p &gt;简单的形式，直接在 overload 中写文本，这些文本被处理为&amp;#8220;重载列表&amp;#8221;页面的摘要。没有备注、示例等区域。 &lt;br /&gt;复杂的形式，在 overload 内部，包含 summary, remarks, example 等标记分别表示&amp;#8220;重载列表&amp;#8221;页面的摘要、备注、示例等。 &lt;br /&gt;示例&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="70%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  bgcolor="#cccccc"&gt;///&amp;lt;overloads&amp;gt;This method has two overloads.&amp;lt;/overloads&amp;gt;&lt;br /&gt;///&amp;lt;summary&amp;gt;This overload just says hello.&amp;lt;/summary&amp;gt;&lt;br /&gt;public void SayHello() { ... }&lt;br /&gt;///&amp;lt;summary&amp;gt;This one says hello to someone.&amp;lt;/summary&amp;gt;&lt;br /&gt;public void SayHello(string toSomeone) { ... }&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="722"&gt;&lt;/a&gt;&amp;lt;para&amp;gt; 标记表示一个段落。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;para [lang="language"]&amp;gt;content&amp;lt;/para&amp;gt;&lt;br /&gt;where:&lt;/p&gt;&#xD;
&lt;p &gt;lang="language" [NDoc 扩充] &lt;br /&gt;表示语言选择器，指示此段落仅对某种编程语言有效。(可选) &lt;br /&gt;content &lt;br /&gt;段落文本。 &lt;br /&gt;应用于&lt;br /&gt;可用于其他标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;此标记经常用于 &amp;lt;summary&amp;gt;, &amp;lt;remarks&amp;gt;, 及 &amp;lt;returns&amp;gt; 等标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;使用 lang 属性表示语言选择器，标准的语言有: Visual Basic, C#, C++ 及 JScript。若代码块适用于多种语言，则用逗号隔开，比如&amp;#8220;Visual Basic, C#, C++&amp;#8221;。 &lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;请参见 &amp;lt;summary&amp;gt; 的示例。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="723"&gt;&lt;/a&gt;The &amp;lt;param&amp;gt; tag describes one of the parameters for the method.&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;param name='name'&amp;gt;description&amp;lt;/param&amp;gt;&lt;br /&gt;where:&lt;/p&gt;&#xD;
&lt;p &gt;name &lt;br /&gt;The name of a method parameter. Enclose the name in single quotation marks (' '). &lt;br /&gt;description &lt;br /&gt;A description for the parameter. &lt;br /&gt;Applies To&lt;br /&gt;Property, Method, Event, Operator.&lt;/p&gt;&#xD;
&lt;p &gt;Remarks&lt;br /&gt;Example&lt;br /&gt;[C#]&lt;br /&gt;/// text for class MyClass&lt;br /&gt;public class MyClass &lt;br /&gt;{&lt;br /&gt;/// &amp;lt;param name="Int1"&amp;gt;Used to indicate status.&amp;lt;/param&amp;gt;&lt;br /&gt;public static void MyMethod(int Int1) &lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;/// text for Main&lt;br /&gt;public static void Main () &lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;See Also&lt;br /&gt;&lt;br /&gt;　&lt;a name="724"&gt;&lt;/a&gt; &amp;lt;paramref&amp;gt; 标记引用一个参数，将以代码样式表示该参数名称。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;paramref name="name"/&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;name &lt;br /&gt;参数的名称。 &lt;br /&gt;应用于&lt;br /&gt;可用于其他标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;示例&lt;br /&gt;[C#]&lt;br /&gt;/// text for class MyClass&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;remarks&amp;gt;MyMethod is a method in the MyClass class. &lt;br /&gt;/// The &amp;lt;paramref name="Int1"/&amp;gt; parameter takes a number.&lt;br /&gt;/// &amp;lt;/remarks&amp;gt;&lt;br /&gt;public static void MyMethod(int Int1)&lt;br /&gt;{&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;/// text for Main&lt;br /&gt;public static void Main ()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;　&lt;a name="725"&gt;&lt;/a&gt; &amp;lt;permission&amp;gt; 标记说明访问某成员所必需的 .NET Framework 安全性 CodeAccessPermission。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;permission cref="member"&amp;gt;description&amp;lt;/permission&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;cref = "member" &lt;br /&gt;表示需要的 CodeAccessPermission 类型。书写时，如果 CodeAccessPermission 是同一命名空间下的类型，member 可以直接写其名称（注意大小写）；如果是其他命名空间的，建议您写该 CodeAccessPermission 的完全限定名称。C# 编译器将检查该 CodeAccessPermission 是否存在。在输出的 XML 文档文件中，C# 编译器会自动转换简写的 member 为完全限定名称。 &lt;br /&gt;description &lt;br /&gt;其他说明。 &lt;br /&gt;应用于&lt;br /&gt;所有成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;System.Security.PermissionSet 使您得以指定对成员的访问。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;using System;&lt;br /&gt;class TestClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;permission cref="System.Security.PermissionSet"&amp;gt;Everyone can access this method.&amp;lt;/permission&amp;gt;&lt;br /&gt;public static void Test()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public static void Main()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;　&lt;br /&gt;　&lt;a name="726"&gt;&lt;/a&gt; &amp;lt;preliminary&amp;gt; 标记将类型/成员标记为&amp;#8220;预发布&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;preliminary&amp;gt;[description]&amp;lt;/preliminary&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;description &lt;br /&gt;对&amp;#8220;预发布&amp;#8221;的说明文本。(可选) &lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;若没有指定 description，则以红色显示默认的文本: &amp;#8220;[此文档为预发布版本，在未来版本中有可能改变。]&amp;#8221;&lt;/p&gt;&#xD;
&lt;p &gt;如果需要把全部类型/成员都标记为&amp;#8220;预发布&amp;#8221;，请使用文档引擎的 Preliminary 配置项。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;// The class summary will get the default message&lt;br /&gt;/// &amp;lt;preliminary/&amp;gt;&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;preliminary&amp;gt;&lt;br /&gt;/// &amp;lt;para&amp;gt;This method is just for testing right now. It might be removed in the near future&amp;lt;/para&amp;gt;&lt;br /&gt;/// &amp;lt;/preliminary&amp;gt;&lt;br /&gt;public void Dump ()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;　&lt;a name="727"&gt;&lt;/a&gt; &amp;lt;remarks&amp;gt; 标记表示对类型或成员的&amp;#8220;备注&amp;#8221;。 &lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;remarks&amp;gt;description&amp;lt;/remarks&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;description &lt;br /&gt;对类型/成员的&amp;#8220;备注&amp;#8221;。 &lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;&amp;lt;remarks&amp;gt; 标记用于对 &amp;lt;summary&amp;gt; 摘要信息的补充。. &lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// You may have some primary information about this class.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;remarks&amp;gt;&lt;br /&gt;/// You may have some additional information about this class.&lt;br /&gt;/// &amp;lt;/remarks&amp;gt;&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// text for Main&lt;br /&gt;public static void Main ()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;　&lt;a name="728"&gt;&lt;/a&gt; &amp;lt;returns&amp;gt; 标记用于说明方法的返回值。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;returns&amp;gt;description&amp;lt;/returns&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;description &lt;br /&gt;对方法的返回值的说明。 &lt;br /&gt;应用于&lt;br /&gt;方法。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;示例&lt;br /&gt;[C#]&lt;br /&gt;/// text for class MyClass&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;returns&amp;gt;Returns zero.&amp;lt;/returns&amp;gt;&lt;br /&gt;public static int GetZero()&lt;br /&gt;{&lt;br /&gt;return 0;&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;/// text for Main&lt;br /&gt;public static void Main ()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;　&lt;a name="729"&gt;&lt;/a&gt; &amp;lt;see&amp;gt; 标记用于在行文中添加一个超链接。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;see cref="member"&amp;gt;[label]&amp;lt;/see&amp;gt;&lt;br /&gt;或&lt;br /&gt;&amp;lt;see href="URL"&amp;gt;[label]&amp;lt;/see&amp;gt;&lt;br /&gt;或&lt;br /&gt;&amp;lt;see langword="null | sealed &lt;br /&gt;| static | abstract | virtual | true | false"/&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;label &lt;br /&gt;超链接的显示文本。 &lt;br /&gt;cref = "member" &lt;br /&gt;表示要链接到的类型(成员)。书写时，如果要链接到的类型(成员)是同一命名空间(类型)中的类型(成员)，member 可以直接写它的名称（注意大小写）；如果是其他命名空间(类型)的，建议您写该类型(成员)的完全限定名称。C# 编译器将检查该类型(成员)是否存在。在输出的 XML 文档文件中，C# 编译器会自动转换简写的 member 为完全限定名称。 &lt;br /&gt;href = "URL" [NDoc 扩充] &lt;br /&gt;一个网络 URL 地址。 &lt;br /&gt;langword [NDoc 扩充] &lt;br /&gt;将会被当作 .NET 关键字粗体显示。如果 langword 是下面备注中的表格里的某个关键字，还将会被替换为相应的说明文本。 &lt;br /&gt;应用于&lt;br /&gt;可用于其他标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;　使用 &amp;lt;seealso&amp;gt; 标记将超链接加入到页面的&amp;#8220;请参见&amp;#8221;区域。&lt;/p&gt;&#xD;
&lt;p &gt;注意: 在 NDoc 1.3 中，对于 MSDN 和 VS.NET 文档引擎，如果一个区域出现了多个指向同一个类型/成员的文档的 &amp;lt;see&amp;gt;，则只转换第一个为超链接，其余的不表示为超链接、只显示为粗体。这将使页面不至于太杂乱。 &lt;/p&gt;&#xD;
&lt;p &gt;可识别的 langword&lt;br /&gt;　如果 langword 为下表中的关键字之一，则会显示右侧相应的说明文本。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="70%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="19%"&gt;&lt;strong&gt;langword&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td width="81%"&gt;&lt;span &gt;&lt;strong&gt;显示 &lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;null &lt;/td&gt;&#xD;
&lt;td &gt;空引用(Visual Basic 中为 Nothing) &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;sealed&lt;/td&gt;&#xD;
&lt;td &gt;密封的(Visual Basic 中为 NotInheritable) &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;static &lt;/td&gt;&#xD;
&lt;td &gt;静态(Visual Basic 中为 Shared) &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;abstract&lt;/td&gt;&#xD;
&lt;td &gt;抽象(Visual Basic 中为 MustInherit)&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;virtual&lt;/td&gt;&#xD;
&lt;td &gt;虚拟(Visual Basic 中为 CanOverride) &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;　请参见 &amp;lt;summary&amp;gt; 中的示例。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="730"&gt;&lt;/a&gt;&amp;lt;seealso&amp;gt; 标记用于在页面的&amp;#8220;请参见&amp;#8221;区域添加一个超链接。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;seealso cref="member"&amp;gt;[label]&amp;lt;/seealso&amp;gt;&lt;br /&gt;或&lt;br /&gt;&amp;lt;seealso href="URL"&amp;gt;[label]&amp;lt;/seealso&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;label &lt;br /&gt;超链接的显示文本。 &lt;br /&gt;cref = "member" &lt;br /&gt;表示要链接到的类型(成员)。书写时，如果要链接到的类型(成员)是同一命名空间(类型)中的类型(成员)，member 可以直接写它的名称（注意大小写）；如果是其他命名空间(类型)的，建议您写该类型(成员)的完全限定名称。C# 编译器将检查该类型(成员)是否存在。在输出的 XML 文档文件中，C# 编译器会自动转换简写的 member 为完全限定名称。 &lt;br /&gt;href = "URL" [NDoc 扩充] &lt;br /&gt;一个网络 URL 地址。 &lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;使用 &amp;lt;see&amp;gt; 标记在行文中添加超链接。&lt;/p&gt;&#xD;
&lt;p &gt;请不要将此标记包含在 &amp;lt;remarks&amp;gt; 标记内部。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;请参见 &amp;lt;summary&amp;gt; 中的示例。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="731"&gt;&lt;/a&gt;&amp;lt;summary&amp;gt; 标记用于对类型或成员的摘要说明。 &lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;summary&amp;gt;description&amp;lt;/summary&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;description &lt;br /&gt;对类型或成员的摘要说明。 &lt;br /&gt;应用于&lt;br /&gt;所有的类型及成员。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;此标记是所有类型及成员最基本的说明，一般的，应为每个公共的、可见的类型/成员书写 summary 文档。在 Visual Studio .NET IDE 的智能感知功能及对象查看器，还有其他大多数开发工具，都会显示 summary 信息。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;remarks&amp;gt; 标记用于更详细的说明。&lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;/// text for class MyClass&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&amp;gt;MyMethod is a method in the MyClass class.&lt;br /&gt;/// &amp;lt;para&amp;gt;Here's how you could make a second paragraph in a description. &amp;lt;see cref="System.Console.WriteLine"/&amp;gt; for information about output statements.&amp;lt;/para&amp;gt;&lt;br /&gt;/// &amp;lt;seealso cref="MyClass.Main"/&amp;gt;&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;public static void MyMethod(int Int1)&lt;br /&gt;{&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;/// text for Main&lt;br /&gt;public static void Main ()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;　&lt;a name="732"&gt;&lt;/a&gt; &amp;lt;threadsafety&amp;gt; 标记用于说明类型在多线程环境中是否安全。 &lt;br /&gt;&amp;lt;threadsafety static="true|false" instance="true|false"/&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;static="true|false" &lt;br /&gt;指示类型的静态成员在多线程环境中是否是安全的。 &lt;br /&gt;instance="true|false" &lt;br /&gt;指示类型的实例成员在多线程环境中是否是安全的。 &lt;br /&gt;应用于&lt;br /&gt;类, 结构。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;示例&lt;br /&gt;[C#]&lt;br /&gt;/// &amp;lt;threadsafety static="true" instance="false"/&amp;gt;&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// not safe across threads&lt;br /&gt;public void InstanceMethod()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/// safe across threads&lt;br /&gt;public static void StaticMethod()&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="733"&gt;&lt;/a&gt;&amp;lt;value&amp;gt; 标记用于说明属性的值。&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;value&amp;gt;property-description&amp;lt;/value&amp;gt;&lt;br /&gt;其中:&lt;/p&gt;&#xD;
&lt;p &gt;property-description &lt;br /&gt;对属性值的说明。 &lt;br /&gt;应用于&lt;br /&gt;属性。&lt;/p&gt;&#xD;
&lt;p &gt;备注&lt;br /&gt;按照约定，总是应该为属性书写 &amp;lt;value&amp;gt; 标记。 &lt;/p&gt;&#xD;
&lt;p &gt;示例&lt;br /&gt;[C#]&lt;br /&gt;/// text for class MyClass&lt;br /&gt;public class MyClass&lt;br /&gt;{&lt;br /&gt;/// &amp;lt;summary&amp;gt;MyProperty is a property in the MyClass class.&amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;value&amp;gt;A string containing the text "MyProperty String".&amp;lt;/value&amp;gt;&lt;br /&gt;public string MyProperty()&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;return "MyProperty String";&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p &gt;}&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="8"&gt;&lt;/a&gt;NDoc 可扩展性&lt;br /&gt;MSDN, MSDN 2003 和 VS.NET 文档引擎都支持一个可扩展的模型，允许您定义自己专有的标记，并指定它们在代码文档中呈现的样式。您或许已经知道，这些文档引擎都使用 XSLT 转换，将 NDoc 中间 XML 数据文件转换为目标 HTML 格式。NDoc 标记的可扩展性也依赖于此，您可以通过自定义的 XSLT 转换文件加入您自定义的标记。（建议，您需要事先了解一些 XSLT 转换的知识，并分析 XML 文档引擎生成的 NDoc 中间 XML 数据文件中的 XML 格式，经过足够的测试，以调试您自己的扩展 XSLT 转换。）&lt;/p&gt;&#xD;
&lt;p &gt;第一步，是在您的 C# 代码中加入您的自定义标记: (注意红色的自定义标记)&lt;/p&gt;&#xD;
&lt;p &gt;[C#] &lt;br /&gt;/// &amp;lt;myTag&amp;gt;This is a custom tag&amp;lt;/myTag&amp;gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// When processed by the VS.NET or MSDN documenters, &lt;br /&gt;/// using the stylesheet "extend-ndoc.xslt" as the ExtensibilityStylesheet &lt;br /&gt;/// property will result in end-user defined tags being displayed in the &lt;br /&gt;/// final help output topics &lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;remarks&amp;gt;This is a test of an inline &amp;lt;null/&amp;gt; tag&amp;lt;/remarks&amp;gt; &lt;br /&gt;public class ABunchOfCustomTags&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;在编译后生成的 /doc 文档中，您可以找到这些自定义的标记。&lt;/p&gt;&#xD;
&lt;p &gt;接下来，创建您的 XSLT 转换模板，控制那些自定义标记的输出位置和样式:&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;xsl:stylesheet version="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform xmlns:MSHelp="http://msdn.microsoft.com/mshelp"&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;xsl:template match="node()" mode="xml-data-island" priority="1"&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;MSHelp:Attr Name="TargetOS" Value="Windows"/&amp;gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/xsl:template&amp;gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;xsl:template match="ndoc" mode="header-section"&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;style type="text/css"&amp;gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;.green &lt;/p&gt;&#xD;
&lt;p &gt;{ &lt;/p&gt;&#xD;
&lt;p &gt;color:green; &lt;/p&gt;&#xD;
&lt;p &gt;} &lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/style&amp;gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/xsl:template&amp;gt; &lt;br /&gt;&amp;lt;xsl:template match="myTag" mode="seealso-section"&amp;gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;h1 &amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;xsl:value-of select="." mode="slashdoc"/&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/xsl:template&amp;gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;xsl:template match="null" mode="slashdoc"&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;xsl:text&amp;gt; null reference (Nothing in Visual Basic) &amp;lt;/xsl:text&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span &gt;&amp;lt;/xsl:template&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p &gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;/p&gt;&#xD;
&lt;p &gt;您应该确认 XSLT 标记的完整和语法的正确，注意 XSLT namespace 是必须的。&lt;/p&gt;&#xD;
&lt;p &gt;如上面示例中看到的那样，使用 stylesheet 中的 templates&amp;#8220;匹配(match)&amp;#8221;您的自定义标记。match 是 XPath 查询的一种，指示 template 将应用于哪些标记。简单的用法是直接匹配您的自定义标记，当然还可以有更高级的用法，对 XSLT 高手们应当是小菜一碟。&lt;/p&gt;&#xD;
&lt;p &gt;注意: 如果您定义的自定义标记中还包含其他标记，您应当加入下面的命令，让它转换这些内含的标记(比如 &amp;lt;see&amp;gt; 等)： &lt;br /&gt;&amp;lt;xsl:apply-templates select="." mode="slashdoc"/&amp;gt;&lt;br /&gt;上例中还展示了向 HTML HEAD 头部添加附加样式定义的方法，即使用 mode 为 header-section 的 template。使用这种方法您可以覆盖 NDoc 默认的样式或者添加附加的样式表等。&lt;/p&gt;&#xD;
&lt;p &gt;什么是 mode 呢？mode 用于指定该内容将显示于文档的哪些区域。NDoc 扩展的自定义标记可以是以下两类:&lt;/p&gt;&#xD;
&lt;p &gt;Section 标记 - 块标记，将显示于文档的某个区域。为 section 标记编写 template 时，mode 必须是预定义的可用 Section 的列表中的一个。 &lt;br /&gt;Inline 标记 - 将和其他注释文本夹杂在一起。为 inline 标记编写 template 时，mode 必须是 "slashdoc"。 &lt;br /&gt;如果您准备编写匹配一些泛型 XPath 查询，如 node(), text(), *, 或 @*，您应当给该 template 指定一个名为 priority、值大于 0.5 的属性，用您编写的 template 替换 NDoc 默认的转换模板。&lt;/p&gt;&#xD;
&lt;p &gt;请注意: XSLT 是大小写敏感的，match 查询模式，以及 mode 值都必须使用正确的大小写，否则将被忽略。&lt;/p&gt;&#xD;
&lt;p &gt;最后，为 MSDN 或 VS.NET 文档引擎设置 ExtensibilityStylesheet 配置，指向您创作好的 XSLT 转换文件。然后使用 NDoc 生成代码文档，您将看到已经按照您编写的 template 规则执行了相应转换。&lt;/p&gt;&#xD;
&lt;p &gt;一张屏幕截图:&lt;/p&gt;&#xD;
&lt;p &gt;&lt;img src="http://www.uml.org.cn/net/images/extendexample.gif" width="530" height="605"  alt="" /&gt;&lt;br /&gt;输出示例&lt;br /&gt;&lt;br /&gt;&lt;a name="811"&gt;&lt;/a&gt;&lt;strong&gt;可用 Section 的列表&lt;/strong&gt;&lt;br /&gt;下面列出了所有可用 section 的清单，它们用于 NDoc 扩展 XSLT 转换模板中 mode 属性的值，指示该标记将显示在代码文档中的区域。&lt;/p&gt;&#xD;
&lt;table  border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr bgcolor="#cccccc"&gt;&#xD;
&lt;td  width="18%"&gt;&lt;strong&gt;Section 名称&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td width="82%"&gt;&lt;span &gt;&lt;strong&gt;说明&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;header-section&lt;/td&gt;&#xD;
&lt;td &gt;HTML 的 HEAD 区域。可以使用此区域添加附加的样式定义等。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;preliminary-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;预发布&amp;#8221;警告区域。仅当注释文档中使用 &amp;lt;preliminary&amp;gt; 标记显式标出，或通过文档引擎的 Preliminary 配置为 true 时，才会显示该区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;summary-section&lt;/td&gt;&#xD;
&lt;td &gt;&lt;br /&gt;&amp;lt;summary&amp;gt; 标记对应的区域。tag.&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;thread-safety-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;线程安全&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;syntax-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;语法&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;value-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;lt;value&amp;gt; 标记对应的&amp;#8220;属性值&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;parameter-section&lt;/td&gt;&#xD;
&lt;td &gt;&amp;lt;param&amp;gt; 标记对应的&amp;#8220;参数&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;returnvalue-section&lt;/td&gt;&#xD;
&lt;td &gt;&amp;lt;returns&amp;gt; 标记对应的&amp;#8220;返回值&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;implements-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;接口实现&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;remarks-section&lt;/td&gt;&#xD;
&lt;td &gt;&amp;lt;remarks&amp;gt; 标记对应的&amp;#8220;备注&amp;#8221;区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;after-remarks-section&lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;备注&amp;#8221;区域后的区域。&lt;br /&gt;注意: 不管&amp;#8220;备注&amp;#8221;区域是否存在，此区域总是存在的。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;obsolete-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;已过时&amp;#8221;区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;events-section&lt;/td&gt;&#xD;
&lt;td &gt;&amp;lt;event&amp;gt; 标记对应的&amp;#8220;事件&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;exceptions-section&lt;/td&gt;&#xD;
&lt;td &gt;&amp;lt;exception&amp;gt; 标记对应的&amp;#8220;异常&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;example-section &amp;lt;example&amp;gt; &lt;/td&gt;&#xD;
&lt;td &gt;标记对应的&amp;#8220;示例&amp;#8221;区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;member-requirements-section&lt;/td&gt;&#xD;
&lt;td &gt;(某一个成员的)&amp;#8220;要求&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;type-requirements-section &lt;/td&gt;&#xD;
&lt;td &gt;(类型的)&amp;#8220;要求&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;seealso-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;请参见&amp;#8221;区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;enumeration-members-section &lt;/td&gt;&#xD;
&lt;td &gt;&amp;#8220;枚举成员&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;footer-row &lt;/td&gt;&#xD;
&lt;td &gt;页脚区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;title-row&lt;/td&gt;&#xD;
&lt;td &gt;页眉区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;overloads-remarks-section &lt;/td&gt;&#xD;
&lt;td &gt;重载页面的&amp;#8220;备注&amp;#8221;区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;overloads-example-section&lt;/td&gt;&#xD;
&lt;td &gt;重载页面的&amp;#8220;示例&amp;#8221;区域。&lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;overloads-summary-section&lt;/td&gt;&#xD;
&lt;td &gt;重载页面的&amp;#8220;摘要&amp;#8221;区域。 &lt;/td&gt;&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;xml-data-island &lt;/td&gt;&#xD;
&lt;td &gt;HTML部嵌入的 XML 数据区域，可以附加自定义的元素或内容。 仅对 VS.NET 2003 文档引擎有效。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&#xD;
&lt;p &gt;&lt;a name="9"&gt;&lt;/a&gt;&lt;strong&gt;实现一个新的文档引擎&lt;/strong&gt;&lt;br /&gt;　实现一个新的文档引擎至少需要编写两个类:&lt;/p&gt;&#xD;
&lt;p &gt;一个从 NDoc.Core.DocumenterBase 继承而来的类&lt;/p&gt;&#xD;
&lt;p &gt;一个从 NDoc.Core.DocumenterConfigBase 继承而来的类&lt;/p&gt;&#xD;
&lt;p &gt;DocumenterConfigBase 是用于存储文档引擎配置信息的基类。它已经包含了一些通用的配置项，这些通用配置主要用于配置 NDoc 中间 XML 数据文件的生成动作。您编写的子类可以添加所需要的特定配置项(比如生成的文档保存在什么路径下等)。&lt;/p&gt;&#xD;
&lt;p &gt;DocumenterBase 是文档引擎的基类。文档引擎的工作模式是，第一步生成 NDoc 中间 XML 数据文件，第二步由各文档引擎将中间 XML 数据文件、分别转换成所需的最终文档格式。此基类完成了第一步的工作，您编写的子类只需完成第二个步骤。&lt;/p&gt;&#xD;
&lt;p &gt;必须实现的成员包括 Clear, Build 方法以及 MainOutputFile 属性等抽象(abstract)成员。&lt;/p&gt;&#xD;
&lt;p &gt;实现 Build 方法时, 可以调用基类的 MergeXML 方法，它完成第一步的 NDoc 中间 XML 数据文件的合并和制作。&lt;/p&gt;&#xD;
&lt;p &gt;使用 XML 文档引擎 可以导出一个 NDoc 中间 XML 数据文件的样例。您可以通过分析它，调试您的自定义转换代码或 XSLT 转换定义。使用 UseNDocXmlFile 配置项，可以节省您的调试时间。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;文档引擎是如何加载的&lt;/strong&gt;&lt;br /&gt;　NDoc 通过反射发出(Reflection)机制动态分析和加载文档引擎。NDoc 启动时，自动检查程序(NDocGui.exe 或 NDocConsole.exe)所在路径中、所有以如下格式命名的程序集:&lt;/p&gt;&#xD;
&lt;p &gt;NDoc.Documenter.&amp;lt;NAME&amp;gt;.dll &lt;/p&gt;&#xD;
&lt;p &gt;其中 &amp;lt;NAME&amp;gt; 是文档引擎的名称(注: 可能与界面中显示的名称不同)。&lt;/p&gt;&#xD;
&lt;p &gt;NDoc 从这些程序集中分析、尝试查找 DocumenterBase 的子类，并加载找到的文档引擎。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;a name="10"&gt;&lt;/a&gt;&lt;strong&gt;为 NDoc 贡献代码&lt;/strong&gt;&lt;br /&gt;您可以有很多种选择，为 NDoc 的开发做出有益的贡献。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;加入 ndoc-users 邮件列表 是最简单的方式、和其他用户分享您的使用心得体会和经验。&lt;/li&gt;&lt;li &gt;如果您发现了 bug，或者有一些不错的新功能建议，请使用 NDoc tracker database， 让我们了解您的发现和想法。&lt;/li&gt;&lt;li &gt;如果您有更多空闲的时间，希望成为 NDoc 开发组的成员、和我们一起实现那些 new features 或者修复那些已知的 bugs，请通过NDoc SourceForge 站点联络项目的负责人、管理员，我们会帮助您开始工作。我们欢迎越来越多的人们加入 NDoc 队伍！&lt;/li&gt;&lt;li &gt;感谢您使用 NDoc！ &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;a name="11"&gt;&lt;/a&gt;&lt;strong&gt;NDoc 用户邮件列表&lt;/strong&gt;&lt;br /&gt;　您也可以搜索 ndoc-users 邮件列表的存档邮件，或者发送问题到这个邮件列表。&lt;/p&gt;&#xD;
&lt;p &gt;&lt;strong&gt;NDoc 跟踪数据库&lt;/strong&gt;&lt;br /&gt;　如果通过以上途径还是没有找到您要的答案，您可以尝试 NDoc 在 SourceForge.net 维护的 Tracker database。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;提交一个支持请求(support request)&lt;/li&gt;&lt;li &gt;提交 Bug 报告&lt;/li&gt;&lt;li &gt;提交新功能建议 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p &gt;&lt;strong&gt;介绍 NDoc 的文章&lt;/strong&gt;&lt;br /&gt;　网络中还有很多不错的 NDoc 介绍文章，下面有些文章发布时间很早，有些链接已经失效了。&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li &gt;[Documenting C# with XML comments], 作者 Ollie Cornes&lt;/li&gt;&lt;li &gt;[Using NDoc: Adding World-Class Documentation to Your .NET Components], 作者 Shawn Van Ness&lt;/li&gt;&lt;li &gt;[Fixing NDoc to emit links for Everett's MSDN docs], 作者 Shawn Van Ness&lt;/li&gt;&lt;li &gt;[Integrate NDoc HTML Help 2 in Visual Studio.NET], 作者 Fons Sonnemans&lt;/li&gt;&lt;li &gt;[Creating class documentation with NDoc], 作者 Rick Harris&lt;/li&gt;&lt;li &gt;[Integrating Help into Visual Studio.NET], 作者 Sune Trudslev&amp;nbsp;&lt;br /&gt; &lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2051698.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051698.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051699.html</id><title type="text">.NET2.0/3.0/3.5区别和VS各个版本概览(转)</title><summary type="text">随着VS2008的推出，.NET框架版本已经升级到了3.5。但是.net framework 3.0和3.5其核心部分还是.net2.0的东西，只不过在其基础上增加了一些个类库。以下这个图表可以很清楚的描述了3个版本框架的不同之处。VS Studio开发工具在这几年的Release版本见下表相应的.NET的发展方向。</summary><published>2011-05-20T01:56:00Z</published><updated>2011-05-20T01:56:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051699.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051699.html"/><content type="html">&lt;span&gt;随着&lt;/span&gt;VS2008&lt;span&gt;的推出，&lt;/span&gt;.NET&lt;span&gt;框架版本已经升级到了&lt;/span&gt;3.5&lt;span&gt;。但是&lt;/span&gt;.net framework 3.0&lt;span&gt;和&lt;/span&gt;3.5&lt;span&gt;其核心部分还是&lt;/span&gt;.net2.0&lt;span&gt;的东西，只不过在其基础上增加了一些个类库。以下这个图表可以很清楚的描述了&lt;/span&gt;3&lt;span&gt;个版本框架的不同之处。&lt;br /&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;span&gt;VS Studio&lt;span&gt;开发工具在这几年的&lt;/span&gt;Release&lt;span&gt;版本见下表&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div forimg="1"&gt;&lt;a href="http://hiphotos.baidu.com/82082068/pic/item/d7de760054d0c71f728b65e6.jpg" target="_blank"&gt;&#xD;
&lt;div forimg="1"&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/82082068/pic/item/75ad030f5789f1e3ab6457e6.jpg" small="0"  alt="" /&gt;&lt;/div&gt;&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;相应的&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;.NET&lt;span&gt;的发展方向。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div forimg="1"&gt;&lt;img  border="0" src="http://hiphotos.baidu.com/82082068/pic/item/b82973073988ecc37b8947e6.jpg" small="0"  alt="" /&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2051699.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/05/20/2051699.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/05/17/2049104.html</id><title type="text">使用Sandcastle Styles 来生成VS2008的帮助文档.</title><summary type="text">1: 下载 Sandcastle Styles http://sandcastlestyles.codeplex.com/2: 下载 HTML Help Workshop http://www.microsoft.com/downloads/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc&amp;amp;displaylang=en3: 使用SandcastleGui.exe来生成帮助文件 C:\Program Files\Sandcastle\Examples\Generic\SandcastleGui.exe4: 使用HTML </summary><published>2011-05-17T09:29:00Z</published><updated>2011-05-17T09:29:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/05/17/2049104.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/05/17/2049104.html"/><content type="html">&lt;p&gt;1: 下载 Sandcastle Styles &lt;a href="http://sandcastlestyles.codeplex.com/"&gt;http://sandcastlestyles.codeplex.com/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2: 下载 HTML Help Workshop &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=00535334-c8a6-452f-9aa0-d597d16580cc&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3: 使用SandcastleGui.exe来生成帮助文件 C:\Program Files\Sandcastle\Examples\Generic\SandcastleGui.exe&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/friendwang1001/Sandcastle.jpg" width="807" height="605" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4: 使用HTML Help Workshop生成CHM文件&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2049104.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/05/17/2049104.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/04/29/2032898.html</id><title type="text">Scrum Works 1.84安装</title><summary type="text">1 : 下载Scrum Works1.84,并下载jboss-4.0.4.GA.zip放入到同一个文件夹.2: 安装成功后，默认的端口是8080，如果想改为别的端口，需要打开文件：\Scrumworks\server\scrumworks\deploy\jbossweb-tomcat55.sar\server.xml文件进行修改。其他配置按系统默认的即可。3: 运行客户端在浏览器中输入：http://localhost:8080/scrumworks/ 出现如下界面：4: 客户端支持两种模式：一种是客户端方式登录，点击&amp;lt;Launch Scrum Works Basic Desktop C</summary><published>2011-04-29T08:15:00Z</published><updated>2011-04-29T08:15:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/04/29/2032898.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/04/29/2032898.html"/><content type="html">&lt;p&gt;1 : 下载Scrum Works1.84,并下载jboss-4.0.4.GA.zip放入到同一个文件夹.&lt;/p&gt;&#xD;
&lt;p&gt;2&amp;nbsp;: 安装成功后，默认的端口是8080，如果想改为别的端口，需要打开文件：\Scrumworks\server\scrumworks\deploy\jbossweb-tomcat55.sar\server.xml文件进行修改。其他配置按系统默认的即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/friendwang1001/1.jpg" width="395" height="85" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3&amp;nbsp;: &amp;nbsp;运行客户端&lt;/p&gt;&#xD;
&lt;p&gt;在浏览器中输入：&lt;a href="http://localhost:8080/scrumworks/"&gt;http://localhost:8080/scrumworks/&lt;/a&gt; 出现如下界面：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/friendwang1001/2.jpg" width="603" height="450" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4&amp;nbsp;: 客户端支持两种模式：一种是客户端方式登录，点击&amp;lt;Launch Scrum Works Basic Desktop Client&amp;gt;运行客户端程序（需要java runtime支持），第一次运行的时候会提示输入&amp;lt;license Key&amp;gt;，可以到Scrum Works网站上下载一个。默认的用户名和密码是：administrator, password. &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2032898.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/04/29/2032898.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/04/11/2012103.html</id><title type="text">SQL Server 2005 中删除重复记录</title><summary type="text">我们在数据库开发和维护时由于各种原因,经常会产生重复数据,如果数据量比较大的话,会是一个很费事的工作,那么怎么能够迅速的删除这些无用的重复记录呢.USE [master]GOif exists (select * from dbo.sysobjects where id = object_id(N&amp;#39;[dbo].[TestTD]&amp;#39;))DROP TABLE TestTDCREATE TABLE TestTD(ProductID INT, ProductName NVARCHAR(50),Unit NVARCHAR(50),Price MONEY)INSERT INTO TestTD</summary><published>2011-04-11T01:57:00Z</published><updated>2011-04-11T01:57:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/04/11/2012103.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/04/11/2012103.html"/><content type="html">&lt;p&gt;我们在数据库开发和维护时由于各种原因,经常会产生重复数据,如果数据量比较大的话,会是一个很费事的工作,那么怎么能够迅速的删除这些无用的重复记录呢.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;USE [master]&lt;br /&gt;GO&lt;/p&gt;&#xD;
&lt;p&gt;if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTD]'))&lt;br /&gt;DROP TABLE TestTD&lt;/p&gt;&#xD;
&lt;p&gt;CREATE TABLE TestTD(ProductID INT, ProductName NVARCHAR(50),Unit NVARCHAR(50),Price MONEY)&lt;/p&gt;&#xD;
&lt;p&gt;INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (1,'A','UnitA',1)&lt;br /&gt;INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (2,'B','UnitA',2)&lt;br /&gt;&lt;span style="color: red"&gt;INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (3,'C','UnitA',3)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red"&gt;INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (3,'C','UnitC',3)&lt;/span&gt;&lt;br /&gt;INSERT INTO TestTD(ProductID,ProductName,Unit,Price) VALUES (4,'D','UnitD',4)&lt;/p&gt;&#xD;
&lt;p&gt;SELECT * FROM TestTD&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #339966"&gt;--Remove Redundancy Records&lt;/span&gt;&lt;br /&gt;DECLARE @AllCount INT&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #339966"&gt;--检查是否有重复记录&lt;/span&gt;&lt;br /&gt;SELECT RedundancyCount = COUNT(ProductID),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProductID&lt;br /&gt;INTO #CostItem&lt;br /&gt;FROM TestTD&lt;br /&gt;GROUP BY ProductID&lt;br /&gt;HAVING COUNT(ProductID) &amp;gt; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;SELECT @AllCount = COUNT(ProductID) FROM #CostItem&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #339966"&gt;-- There are some Redundancy Records. Remove them.&lt;/span&gt;&lt;br /&gt;IF @AllCount &amp;gt; 0&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @CurrentPosition&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;br /&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @DuplicateCount&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INT,&lt;br /&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ProductID&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; INT&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @CurrentPosition = @AllCount&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT SortOrder = ROW_NUMBER() OVER (ORDER BY ProductID),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INTO #T&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM #CostItem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #339966"&gt;--循环删除&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHILE @CurrentPosition &amp;gt; 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #339966"&gt;--取出有重复数据的ProductID和重复的个数&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @DuplicateCount = RedundancyCount,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ProductID = ProductID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM #T WHERE SortOrder = @CurrentPosition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: #339966"&gt;--利用rownumber来删除,使重复的数据只保留一条.&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;WITH [CostItem_RowID] AS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(SELECT ROW_NUMBER() OVER (ORDER BY @ProductID) AS ROWID, * &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM TestTD gwci WHERE gwci.ProductID = @ProductID)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DELETE FROM [CostItem_RowID] WHERE ROWID &amp;lt; @DuplicateCount&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SET @CurrentPosition = @CurrentPosition - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; DROP TABLE #T&amp;nbsp;&lt;br /&gt;END&lt;/p&gt;&#xD;
&lt;p&gt;DROP TABLE #CostItem&lt;br /&gt;SELECT * FROM TestTD&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;效果图&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/friendwang1001/tt1.jpg" width="435" height="267" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/2012103.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/04/11/2012103.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957800.html</id><title type="text">第一章 C#语言基础(C# Language Elements)</title><summary type="text">为什么你应该改变现在正在做的即使它是好的.答案就是你会变得更强.你改变工具或者是语言来让你更高效.如果不改变习惯将很难获取你的期望. 当C#这种新的语言与大家一些熟悉的语言比如C++和Java拥有很多的共同点是一件很困难的事情.回到旧的习惯是一件很容易的事情,不过大多数的就习惯还是好的. C#语言的设计者希望我们能够使用以前的语言的知识.不过他们也添加和修改了一些元素来提供更集成的通用语言运行时(CLR)及对组件开发提供了更好的支持.本章将讨论那些你应该改变的习惯.</summary><published>2011-02-18T06:21:00Z</published><updated>2011-02-18T06:21:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957800.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957800.html"/><content type="html">&lt;p&gt;为什么你应该改变现在正在做的即使它是好的.答案就是你会变得更强.你改变工具或者是语言来让你更高效.如果不改变习惯将很难获取你的期望. 当C#这种新的语言与大家一些熟悉的语言比如C++和Java拥有很多的共同点是一件很困难的事情.回到旧的习惯是一件很容易的事情,不过大多数的就习惯还是好的. C#语言的设计者希望我们能够使用以前的语言的知识.不过他们也添加和修改了一些元素来提供更集成的通用语言运行时(CLR)及对组件开发提供了更好的支持.本章将讨论那些你应该改变的习惯.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/1957800.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957800.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957787.html</id><title type="text">Effective C#: 50个细节提高你的C#[50 Specific Ways to Improve Your C#]</title><summary type="text">最近发现了一般好书,叫Effective C#: 50 Specific Ways to Improve Your C#.[Effective C#: 50个细节提高你的C#],网上也有一些翻译,不过看着都不太准确,最近闲来有空,就一边学习一边翻译试试了.此内容只用于学习和讨论,如涉及版权问题,本人将删除内容.第一章 C#语言基础(C# Language Elements) Item 1: 尽可能的使用属性代替可访问的数据成员(Always Use Properties Instead of Accessible Data Members) Item 2: 使用readonly代替const(</summary><published>2011-02-18T06:16:00Z</published><updated>2011-02-18T06:16:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957787.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957787.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;最近发现了一般好书,叫Effective C#: 50 Specific Ways to Improve Your C#.[Effective C#: 50个细节提高你的C#],网上也有一些翻译,不过看着都不太准确,最近闲来有空,就一边学习一边翻译试试了.此内容只用于学习和讨论,如涉及版权问题,本人将删除内容.&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0"  href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957800.html"&gt;&lt;font color="#1a8bc8"&gt;第一章 C#语言基础(C# Language Elements)&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_6"  href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957727.html"&gt;&lt;font color="#1a8bc8"&gt;Item 1: 尽可能的使用属性代替可访问的数据成员(Always Use Properties Instead of Accessible Data Members)&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_7"  href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957728.html"&gt;&lt;font color="#1a8bc8"&gt;Item 2: 使用readonly代替const(Prefer readonly to const)&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_5"  href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957756.html"&gt;&lt;font color="#1a8bc8"&gt;Item 3: 使用 is 或 as 去做类型转换(Prefer the is or as Operators to Casts)&lt;/font&gt;&lt;/a&gt;&lt;font style="background-color: #c7edcc"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/1957787.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957787.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957775.html</id><title type="text">Item 6: Distinguish Between Value Types and Reference Types</title><summary type="text">Item 6: Distinguish Between Value Types and Reference Types</summary><published>2011-02-18T06:09:00Z</published><updated>2011-02-18T06:09:00Z</updated><author><name>皮皮虾的blog</name><uri>http://www.cnblogs.com/friendwang1001/</uri></author><link rel="alternate" href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957775.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957775.html"/><content type="html">Item 6: Distinguish Between Value Types and Reference Types&lt;img src="http://www.cnblogs.com/friendwang1001/aggbug/1957775.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/friendwang1001/archive/2011/02/18/1957775.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
