chm文档生成->Sandcastle使用帮助

1.介绍

Sandcastle是微软提供的开源的,用于生成.net文档帮助的工具。

源代码路径:https://github.com/EWSoftware/SHFB,进去后能找到Relase版本的路径(https://github.com/EWSoftware/SHFB/releases

官方帮助文档: http://ewsoftware.github.io/SHFB

(其中xml的标签使用:http://ewsoftware.github.io/XMLCommentsGuide/)

2.安装

1.安装前关闭VS,直接点击安装包进行安装

3.开始

1.打开待生成文档的工程的xml输出

  工程属性中的“生成-输出-xml文档文件”。生成一下,就会生成它的xml文档

2.创建工程

  以vs2019为例,在解决方案中添加 Sandcastle Help File Builder Project

 

  解决方案管理器中,选中Documentation Sources,右键”Add Documentation Sources”,选择目标工程的dll和xml文件,生成即可。

 

4.优化配置

1.工程属性中设置语言、标题等

  例:默认为英文,改为中文。属性里的“Help File”

 

2.支持语言,生成的文件格式

  默认支持的F#、VB,没什么用,可去掉勾选。

  默认生成chm文件,其他格式也挺有用的。(mshc文件与VS的融合很好,选中内容按F1就可启动搜索,如果需要可勾上)

 

3.打开报警,把报警全解决掉。

  这样才不会出现文档有的字段没有解释,解释与参数对不上等问题

  文档应该只支持按///生成的那种注释

  再搜索一下“></param>”,找到所有没给参数注释写内容的地方,处理掉

4.关闭命名空间注释的报警

 

  命名空间一般都不给它注释的,因为往往多个文件用同一个命名空间,在哪里注释?但是不给它注释,默认情况下就会出现上图这样的。

解决办法:

  工程属性中,Missing Tags,去掉“Namespace documentation”的勾选.

 

5.Xml文档注释

  以下列出一部分在 Sandcstle 可用文档注释。如果需要获取全部可用文档注释,则请参考 C# XML 文档注释和 NDoc 标记。Sandcastle 支持所有 C# XML 文档注释和部分 NDoc 标记,暂不支持用户自定义标记。

标记

说明

<a>

<a href="url">Sample</a>表示一个超级链接。

<b>

<b>...</b> 表示加粗。

<c>

<c>...</c> 代码引用。

<code>

<code [ lang="VB | VB.NET | C# | C++ | J#" source="path" region="region" ]>...</code> 表示一段代码引用。

<example>

<example>...</example> 表示示例。

<note>

<note type="caution | implementnotes | callers | inheriters">...</note> 表示备注。

<list>

<list type="bullet | number | table">...</list> 表示一个列表。

<para>

<para> 表示一个段落。

<param>

<param name="">...</param> 表示参数说明。

<paramref>

<paramref cref="" /> 表示一个参数的引用。

<summary>

<summary> 表示摘要。

<typeparam>, <typeparamref>

<typeparam name="T"> 表示一个类型参数。

<event>

<event> 表示方法触发的一个事件说明。

<remarks>

<remarks> 表示额外的备注。

<threadsafety>

<threadsafety instance="true | false" static="true | false"> 表示线程安全说明。

<value>

<value> 表示属性的值说明。

<returns>

<returns type="type"> 表示方法的返回值说明。

<preliminary>

表示该文档是预发行版本。

<overload>

表示方法被重载。

6.标签示例

  具体参考代码中///注释标签形式

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Data;
  5 using System.Data.SqlClient;
  6 using System.Data.OracleClient;
  7 using System.Data.Common;
  8 
  9 namespace Heading.Data
 10 {
 11     /// <summary>
 12     /// 数据库类型
 13     /// </summary>
 14     public enum DbmsType
 15     {
 16         /// <summary>
 17         /// SqlServer
 18         /// </summary>
 19         SqlServer,
 20 
 21         /// <summary>
 22         /// Oracle
 23         /// </summary>
 24         Oracle,
 25     }
 26 
 27     /// <summary>
 28     /// 存放应用程序全局资源和公共函数的静态类。
 29     /// </summary>
 30     /// <remarks>
 31     /// <c>DataHelper</c> 包含对数据库的全局操作集合,包括打开和关闭连接、创建事务等。此类支持以下 Microsoft SQL Server 和 Oracle 版本。
 32     /// <list type="table">
 33     /// <listheader><item>Microsoft SQL Server 版本</item><description>Oracle 版本</description></listheader>
 34     /// <item><item><list type="bullet">
 35     /// <item>Microsoft SQL Server 2000</item>
 36     /// <item>Microsoft SQL Server 2005</item>
 37     /// <item>Microsoft SQL Server 2008</item>
 38     /// </list></item>
 39     /// <description><list type="bullet">
 40     /// <item>Oracle 8i</item><item>Oracle 9i</item><item>Oracle 10g</item><item>Oracle 11g</item>
 41     /// </list></description></item>
 42     /// </list>
 43     /// </remarks>
 44     /// <example>
 45     /// 以下示例展示如何使用 <c>DataHelper</c> 类执行数据库事务操作。
 46     /// <code lang="C#" source="SamplesCSharpDataHelper.cs" region="DataHelper" />
 47     /// <note type="caution">
 48     /// <para>
 49     /// 此类是静态类。可在应用程序全局范围内使用,在使用此类的任何方法之前,您必须先初始化 <c>DataHelper</c>.Connection 属性。
 50     /// 有关 Connection 属性的信息,请参见 <see cref="T:System.Data.Common.DbConnection" /> 51     /// </para>
 52     /// </note>
 53     /// </example>
 54     /// <seealso cref="DbmsType" />
 55     public static class DataHelper
 56     {
 57         // 为数据库设置连接字符串。
 58         private static DbConnection connection;
 59 
 60         /// <summary>
 61         /// 获取用于存储事务的 DbTransaction。
 62         /// </summary>
 63         public static DbTransaction Transaction { get { return transaction; } }
 64         private static DbTransaction transaction;
 65 
 66         /// <summary>
 67         /// 获取或设置数据库连接。
 68         /// </summary>
 69         public static DbConnection Connection { get { return connection; } set { connection = value; } }
 70 
 71         /// <summary>
 72         /// 获取或设置数据库连接类型。
 73         /// </summary>
 74         public static DbmsType ConnectionType
 75         {
 76             get { return connectionType; }
 77             set
 78             {
 79                 switch (value)
 80                 {
 81                     case DbmsType.Oracle:
 82                         CloseConnection();
 83                         connection = new OracleConnection();
 84                         break;
 85                     case DbmsType.SqlServer:
 86                         CloseConnection();
 87                         connection = new SqlConnection();
 88                         break;
 89                 }
 90                 connectionType = value;
 91             }
 92         }
 93         private static DbmsType connectionType;
 94 
 95         /// <summary>
 96         /// 在指定的连接上下文中执行 SQL 命令。
 97         /// </summary>
 98         /// <param name="command">需要执行的 T-SQL 语句。</param>
 99         /// <returns>执行语句后影响的行数。</returns>
100         public static int ExecuteSqlCommand(string command)
101         {
102             RaiseConnectionNotOpenedException();
103             using (DbCommand cmd = Connection.CreateCommand())
104             {
105                 cmd.Transaction = transaction;
106                 cmd.CommandText = command;
107                 return cmd.ExecuteNonQuery();
108             }
109         }
110 
111         /// <summary>
112         /// 在指定的连接上下文中执行 SQL 命令。
113         /// </summary>
114         /// <param name="command">需要执行的 T-SQL 语句。</param>
115         /// <param name="param">格式化字符串。</param>
116         /// <returns>执行语句后影响的行数。</returns>
117         public static int ExecuteSqlCommand(string command, params object[] param)
118         {
119             return ExecuteSqlCommand(string.Format(command, param));
120         }
121 
122         /// <summary>
123         /// 在指定的连接上下文中执行 SQL 命令,并返回包含数据集的 DbDataReader。
124         /// </summary>
125         /// <param name="command">需要执行的 T-SQL 语句。</param>
126         /// <returns>存放执行结果的 DbDataReader。</returns>
127         public static DbDataReader ExecuteSqlReader(string command)
128         {
129             RaiseConnectionNotOpenedException();
130             using (DbCommand cmd = Connection.CreateCommand())
131             {
132                 cmd.Transaction = transaction;
133                 cmd.CommandText = command;
134                 return cmd.ExecuteReader();
135             }
136         }
137 
138         /// <summary>
139         /// 在指定的连接上下文中执行 SQL 命令,并返回包含数据集的 DbDataReader。
140         /// </summary>
141         /// <param name="command">需要执行的 T-SQL 语句。</param>
142         /// <param name="param">格式化字符串。</param>
143         /// <returns>存放执行结果的 DbDataReader。</returns>
144         public static DbDataReader ExecuteSqlReader(string command, params object[] param)
145         {
146             return ExecuteSqlReader(string.Format(command, param));
147         }
148 
149         /// <summary>
150         /// 打开数据库连接,如果连接已经打开,则不会再次打开。
151         /// </summary>
152         public static void OpenConnection()
153         {
154             if (connection != null && connection.State == ConnectionState.Closed)
155                 connection.Open();
156         }
157 
158         /// <summary>
159         /// 关闭数据库连接。如果连接已经关闭,则不会再次关闭。
160         /// </summary>
161         public static void CloseConnection()
162         {
163             if (connection != null && connection.State == ConnectionState.Open)
164                 connection.Close();
165         }
166 
167         /// <summary>
168         /// 开始一个 SQL 事务,并将 Transaction 属性设置为当前活动的 DbTransaction。
169         /// </summary>
170         public static void BeginTransaction()
171         {
172             RaiseConnectionNotOpenedException();
173             transaction = Connection.BeginTransaction();
174         }
175 
176         /// <summary>
177         /// 回滚当前活动的 SQL 事务。
178         /// </summary>
179         public static void Rollback()
180         {
181             RaiseTransactionException();
182             transaction.Rollback();
183         }
184 
185         /// <summary>
186         /// 提交当前活动的 SQL 事务。
187         /// </summary>
188         public static void Commit()
189         {
190             RaiseTransactionException();
191             transaction.Commit();
192             try
193             {
194                 transaction.Dispose();
195             }
196             finally { transaction = null; }
197         }
198 
199         /// <summary>
200         /// 检查当前数据库连接是否存在指定的表。
201         /// </summary>
202         /// <param name="tableName">表名称。</param>
203         /// <returns>如果存在此对象则返回 true。否则返回 false。</returns>
204         public static bool TableExists(string tableName)
205         {
206             RaiseConnectionNotOpenedException();
207             string command = null;
208             switch (connectionType)
209             {
210                 case DbmsType.Oracle:
211                     command = @"SELECT 1 FROM user_objects WHERE UPPER(object_name) = UPPER('{0}') " +
212                         "AND object_type = 'TABLE'";
213                     break;
214                 case DbmsType.SqlServer:
215                     command = @"SELECT 1 FROM sysobjects WHERE Name = N'{0}' AND Type = N'U'";
216                     break;
217             }
218 
219             using (DbDataReader dr = ExecuteSqlReader(command, tableName))
220             {
221                 return dr.HasRows;
222             }
223         }
224 
225         /// <summary>
226         /// 检查当前数据库连接是否存在指定的存储过程。
227         /// </summary>
228         /// <param name="tableName">存储过程名称。</param>
229         /// <returns>如果存在此对象则返回 true。否则返回 false。</returns>
230         public static bool StoredProcedureExists(string tableName)
231         {
232             RaiseConnectionNotOpenedException();
233 
234             string command = null;
235             switch (connectionType)
236             {
237                 case DbmsType.Oracle:
238                     command = @"SELECT 1 FROM user_objects WHERE UPPER(object_name) = UPPER('{0}') " +
239                         "AND object_type = 'FUNCTION' OR object_type = 'PROCEDURE'";
240                     break;
241                 case DbmsType.SqlServer:
242                     command = @"SELECT 1 FROM sysobjects WHERE Name = N'{0}' AND Type = N'P'";
243                     break;
244             }
245 
246             using (DbDataReader dr = ExecuteSqlReader(command, tableName))
247             {
248                 return dr.HasRows;
249             }
250         }
251 
252         private static void RaiseConnectionNotOpenedException()
253         {
254             if (Connection == null)
255                 throw new Exception("输据库连接对象未设置。");
256             if (Connection.State != ConnectionState.Open)
257                 throw new Exception("输据库连接对象未打开。");
258         }
259 
260         private static void RaiseTransactionException()
261         {
262             if (transaction == null) throw new Exception("Transaction 属性没有初始化。请先调用 BeginTransaction。");
263         }
264 
265         private static int InternalExecuteCommand(string command)
266         {
267             RaiseConnectionNotOpenedException();
268             using (DbCommand cmd = Connection.CreateCommand())
269             {
270                 cmd.Transaction = transaction;
271                 cmd.CommandText = command;
272                 return cmd.ExecuteNonQuery();
273             }
274         }
275 
276         private static int InternalExecuteCommand(string command, params object[] param)
277         {
278             return InternalExecuteCommand(string.Format(command, param));
279         }
280 
281         private static DbDataReader InternalExecuteReader(string command)
282         {
283             RaiseConnectionNotOpenedException();
284             using (DbCommand cmd = Connection.CreateCommand())
285             {
286                 cmd.Transaction = transaction;
287                 cmd.CommandText = command;
288                 return cmd.ExecuteReader();
289             }
290         }
291 
292         private static DbDataReader InternalExecuteReader(string command, params object[] param)
293         {
294             return InternalExecuteReader(string.Format(command, param));
295         }
296     }
297 }

工程属性打开xml文档输出,并将生成的xml添加到Sandcastle工程中,生成Sandcastle工程就可以得到chm文档了!

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using System.Data;
 5 using System.Data.SqlClient;
 6 using System.Data.OracleClient;
 7 using System.Data.Common;
 8 
 9 namespace Heading.Data
10 {
11     #region DataHelper
12 
13     /// <summary>
14     /// 获取或设置数据库连接。
15     /// </summary>
16     public static DbConnection Connection { get { return connection; } set { connection = value; } }
17 
18     /// <summary>
19     /// 在指定的连接上下文中执行 SQL 命令。
20     /// </summary>
21     /// <param name="command">需要执行的 T-SQL 语句。</param>
22     /// <returns>执行语句后影响的行数。</returns>
23     public static int ExecuteSqlCommand(string command)
24         {
25             RaiseConnectionNotOpenedException();
26             using (DbCommand cmd = Connection.CreateCommand())
27             {
28                 cmd.Transaction = transaction;
29                 cmd.CommandText = command;
30                 return cmd.ExecuteNonQuery();
31             }
32         }
33         private static void RaiseConnectionNotOpenedException()
34         {
35             if (Connection == null)
36                 throw new Exception("输据库连接对象未设置。");
37             if (Connection.State != ConnectionState.Open)
38                 throw new Exception("输据库连接对象未打开。");
39         }
40     #endregion

效果

 

 

 

 -->The End 2020.7.6

原文地址:https://www.cnblogs.com/tuhong/p/13254497.html