NDoc使用簡要手冊

NDoc是一個.NET代碼文檔生成工具,有點象JDoc,但這個是在.NET下的工具。

NDoc使用Visual Studio.NET開發過程中生成的程序集和XML文檔來生成一些格式象Visual Studio.NET和.NET Frmaework SDK在線幫助文檔那樣的一些編譯後的HTML幫助文檔。

它是一個OpenSource的項目,在http://ndoc.sourceforge.net可以下載到SourceCode。

使用十分簡單,例如創建一個簡單的項目來看NDoc可以爲我們做些什麼?
創建一個簡單項目叫testNDoc,只有一個WindowForm,上面有個Button,單擊顯示信息。
將顯示信息的類封裝爲ShowMsg類,只有一個方法ShowMessage.

代碼如下:
showMsg.cs

None.gifusing System;
None.gif
using System.Windows.Forms;
None.gif
None.gif
namespace testNDoc
ExpandedBlockStart.gif
{
ExpandedSubBlockStart.gif    
/// <summary>
InBlock.gif    
/// ShowMsg 的摘要說明。
InBlock.gif    
/// 顯示測試信息的類
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class ShowMsg
ExpandedSubBlockStart.gif    
{
InBlock.gif        
public ShowMsg()
ExpandedSubBlockStart.gif        
{
InBlock.gif            
//
InBlock.gif            
// TODO: 在此處添加構造函數邏輯
InBlock.gif            
//
ExpandedSubBlockEnd.gif
        }

ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 測試字符串
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        private string testStr = null;
InBlock.gif
ContractedSubBlock.gif        

InBlock.gif
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 增加幾個字符的私有函數
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="msg">傳遞字符串參數</param>
ExpandedSubBlockEnd.gif        
/// <returns>返回處理過的字符串</returns>

InBlock.gif        protected string addStr(string msg)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
// 返回字符串
InBlock.gif
            return "StrAdd:" + msg;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// test addOk
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="msg"></param>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif        protected string addOk(string msg)
ExpandedSubBlockStart.gif        
{
InBlock.gif            
return "Ok:" + msg;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
Form1.cs
None.gifusing System;
None.gif
using System.Drawing;
None.gif
using System.Collections;
None.gif
using System.ComponentModel;
None.gif
using System.Windows.Forms;
None.gif
using System.Data;
None.gif
None.gif
namespace testNDoc
ExpandedBlockStart.gif
{
ExpandedSubBlockStart.gif    
/// <summary>
InBlock.gif    
/// Form1 的摘要說明。
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class testNDoc : System.Windows.Forms.Form
ExpandedSubBlockStart.gif    
{
InBlock.gif        
private System.Windows.Forms.Button btnShowMsg;
InBlock.gif        
private System.Windows.Forms.Button btnNoSummary;
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 必需的設計器變量。
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        private System.ComponentModel.Container components = null;
InBlock.gif
InBlock.gif        
public testNDoc()
ExpandedSubBlockStart.gif        
{
InBlock.gif            
//
InBlock.gif            
// Windows 窗體設計器支持所必需的
InBlock.gif            
//
InBlock.gif
            InitializeComponent();
InBlock.gif
InBlock.gif            
//
InBlock.gif            
// TODO: 在 InitializeComponent 調用後添加任何構造函數代碼
InBlock.gif            
//
ExpandedSubBlockEnd.gif
        }

InBlock.gif
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 清理所有正在使用的資源。
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        protected override void Dispose( bool disposing )
ExpandedSubBlockStart.gif        
{
InBlock.gif            
if( disposing )
ExpandedSubBlockStart.gif            
{
InBlock.gif                
if (components != null
ExpandedSubBlockStart.gif                
{
InBlock.gif                    components.Dispose();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
base.Dispose( disposing );
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gif        
Windows 窗體設計器生成的代碼
InBlock.gif
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 應用程序的主入口點。
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        [STAThread]
InBlock.gif        
static void Main() 
ExpandedSubBlockStart.gif        
{
InBlock.gif            Application.Run(
new testNDoc());
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 單擊button顯示信息
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="sender"></param>
ExpandedSubBlockEnd.gif        
/// <param name="e"></param>

InBlock.gif        private void btnShowMsg_Click(object sender, System.EventArgs e)
ExpandedSubBlockStart.gif        
{
InBlock.gif            ShowMsg sMsg 
= new ShowMsg();
InBlock.gif            sMsg.ShowMessage(
"Hello?");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
private void btnNoSummary_Click(object sender, System.EventArgs e)
ExpandedSubBlockStart.gif        
{
InBlock.gif            ShowMsg sMsg 
= new ShowMsg();
InBlock.gif            sMsg.ShowMessage(
"No Summary Click!");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif


爲了使用NDoc生成文檔,必須有一個編譯後的程序集和一個導出的XML文件,要生成這個XML文件,必須在項目屬性中將生成XML文件的

選項填上文件名字,如下圖:
NDoc1.JPG
編譯有生成一個對應的XML文件:
NDoc2.JPG
打開XML文件看到以下內容(注意:這個XML文件並不是NDoc生成的,而是Visual Studio.NET生成的):

None.gif<?xml version="1.0"?>
None.gif
<doc>
None.gif    
<assembly>
None.gif        
<name>testNDoc</name>
None.gif    
</assembly>
None.gif    
<members>
None.gif        
<member name="T:testNDoc.testNDoc">
None.gif            
<summary>
None.gif            Form1 的摘要說明。
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="F:testNDoc.testNDoc.components">
None.gif            
<summary>
None.gif            必需的設計器變量。
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.testNDoc.Dispose(System.Boolean)">
None.gif            
<summary>
None.gif            清理所有正在使用的資源。
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.testNDoc.InitializeComponent">
None.gif            
<summary>
None.gif            設計器支持所需的方法 - 不要使用代碼編輯器修改
None.gif            此方法的內容。
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.testNDoc.Main">
None.gif            
<summary>
None.gif            應用程序的主入口點。
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.testNDoc.btnShowMsg_Click(System.Object,System.EventArgs)">
None.gif            
<summary>
None.gif            單擊button顯示信息
None.gif            
</summary>
None.gif            
<param name="sender"></param>
None.gif            
<param name="e"></param>
None.gif        
</member>
None.gif        
<member name="T:testNDoc.ShowMsg">
None.gif            
<summary>
None.gif            ShowMsg 的摘要說明。
None.gif            顯示測試信息的類
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="F:testNDoc.ShowMsg.testStr">
None.gif            
<summary>
None.gif            測試字符串
None.gif            
</summary>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.ShowMsg.ShowMessage(System.String)">
None.gif            
<summary>
None.gif            顯示信息在信息框中的公有函數
None.gif            
</summary>
None.gif            
<param name="msg">傳遞字符串參數</param>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.ShowMsg.addStr(System.String)">
None.gif            
<summary>
None.gif            增加幾個字符的私有函數
None.gif            
</summary>
None.gif            
<param name="msg">傳遞字符串參數</param>
None.gif            
<returns>返回處理過的字符串</returns>
None.gif        
</member>
None.gif        
<member name="M:testNDoc.ShowMsg.addOk(System.String)">
None.gif            
<summary>
None.gif            test addOk
None.gif            
</summary>
None.gif            
<param name="msg"></param>
None.gif            
<returns></returns>
None.gif        
</member>
None.gif    
</members>
None.gif
</doc>
None.gif

仔細對比這個XML文件和源代碼之間的關係可以發現:
1.這個XML文件列出了大部分的方法,不管這些方法是私有,公有還是保護的,甚至構造函數;
2.region的部分並沒有列入XML文件;
3.沒有帶註釋的方法也沒有列入XML文件,例如ShowMsg的構造函數和Form1.cs中的btnNoSummary_Click函數部分;
4.有註釋的變量也被列入XML文件了,例如Form1.cs中的private System.ComponentModel.Container components = null和ShowMsg類

中的private string testStr = null;5.對於//這種方式的註釋並沒有例如文件;

小結:以下面方式的註釋會列入XML文件中

ExpandedBlockStart.gif        /// <summary>
InBlock.gif        
/// 增加幾個字符的私有函數
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="msg">傳遞字符串參數</param>
InBlock.gif        
/// <returns>返回處理過的字符串</returns>
InBlock.gif

那麼NDoc處理後又是如何的呢?

安裝NDoc後運行程序,選擇程序集和對應的XML文件,如下圖
NDoc3.JPG
然後就設置生成文檔的相關參數了
文檔類型目前支持6種:
HtmlHelp2  注意,這種文檔需要安裝Visual Studio Help Integration Kit,可以在微軟網站下載;
JavaDoc    類似於Java API的文檔方式,習慣看Java API的人比較喜歡
LaTeX (alpha)
LinearHtml (alpha)
MSDN
XML

選擇不同的文檔類型需要設置一些不同的參數,這裏選擇HtmlHelp2格式。
可以設置的參數比較多,很多可以使用默認值,每個的作用都可以在下面看到它的解釋,這個例子選擇的設置如下圖:
NDoc4.JPG
選擇菜單上的Documentation->Build就可以生成需要的幫助文檔了。

此時就會在NDoc文件所在目錄下生成一個doc目錄,全部生成的文件都放在這個目錄下。

打開NDocTest.chm,看到的效果如下:
NDoc5.JPG
這裏可以看到生成的信息並不是單單依賴於上面討論的XML文件,也生成了很多完整的信息,這些信息應該通過反射機制在程序集中讀取的。

對比結果可以看到:
1.生成的CHM只顯示了public和protected,而private則沒有顯示,不管是否在XML有反應;
2.繼承過來的方法也會在CHM中顯示出來;
3.生成的CHM主要以程序集爲基礎,將public和protected的方法顯示出來,而XML主要作爲註釋的參考,例如項目中有些沒有註釋的共

有方法在XML中沒有反應出來,但是在CHM也會顯示出來。

小結:NDoc生成的CHM並沒有完全將項目中的全部註釋抽取出來,但是它作爲生成API文檔則是十分有用的。


另外值得注意的是:
在使用中發現NDoc的同步似乎有些問題,例如第一次生成後,對有些方法做了些修改,註釋的修改可以同步更新,但一些方法的屬性變更並沒有直接反應過去,例如將public改成protected,在生成的CHM中也不會直接反應。

有遇過這個問題或者知道如何解決的高手請指教。72_72.gif

例子代碼可以從這裏下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章