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
using System.Windows.Forms;
namespace testNDoc
{
/// <summary>
/// ShowMsg 的摘要說明。
/// 顯示測試信息的類
/// </summary>
public class ShowMsg
{
public ShowMsg()
{
//
// TODO: 在此處添加構造函數邏輯
//
}
/// <summary>
/// 測試字符串
/// </summary>
private string testStr = null;
/// <summary>
/// 增加幾個字符的私有函數
/// </summary>
/// <param name="msg">傳遞字符串參數</param>
/// <returns>返回處理過的字符串</returns>
protected string addStr(string msg)
{
// 返回字符串
return "StrAdd:" + msg;
}
/// <summary>
/// test addOk
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
protected string addOk(string msg)
{
return "Ok:" + msg;
}
}
}
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace testNDoc
{
/// <summary>
/// Form1 的摘要說明。
/// </summary>
public class testNDoc : System.Windows.Forms.Form
{
private System.Windows.Forms.Button btnShowMsg;
private System.Windows.Forms.Button btnNoSummary;
/// <summary>
/// 必需的設計器變量。
/// </summary>
private System.ComponentModel.Container components = null;
public testNDoc()
{
//
// Windows 窗體設計器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 調用後添加任何構造函數代碼
//
}
/// <summary>
/// 清理所有正在使用的資源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
Windows 窗體設計器生成的代碼
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new testNDoc());
}
/// <summary>
/// 單擊button顯示信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnShowMsg_Click(object sender, System.EventArgs e)
{
ShowMsg sMsg = new ShowMsg();
sMsg.ShowMessage("Hello?");
}
private void btnNoSummary_Click(object sender, System.EventArgs e)
{
ShowMsg sMsg = new ShowMsg();
sMsg.ShowMessage("No Summary Click!");
}
}
}
爲了使用NDoc生成文檔,必須有一個編譯後的程序集和一個導出的XML文件,要生成這個XML文件,必須在項目屬性中將生成XML文件的
選項填上文件名字,如下圖:
編譯有生成一個對應的XML文件:
打開XML文件看到以下內容(注意:這個XML文件並不是NDoc生成的,而是Visual Studio.NET生成的):
<doc>
<assembly>
<name>testNDoc</name>
</assembly>
<members>
<member name="T:testNDoc.testNDoc">
<summary>
Form1 的摘要說明。
</summary>
</member>
<member name="F:testNDoc.testNDoc.components">
<summary>
必需的設計器變量。
</summary>
</member>
<member name="M:testNDoc.testNDoc.Dispose(System.Boolean)">
<summary>
清理所有正在使用的資源。
</summary>
</member>
<member name="M:testNDoc.testNDoc.InitializeComponent">
<summary>
設計器支持所需的方法 - 不要使用代碼編輯器修改
此方法的內容。
</summary>
</member>
<member name="M:testNDoc.testNDoc.Main">
<summary>
應用程序的主入口點。
</summary>
</member>
<member name="M:testNDoc.testNDoc.btnShowMsg_Click(System.Object,System.EventArgs)">
<summary>
單擊button顯示信息
</summary>
<param name="sender"></param>
<param name="e"></param>
</member>
<member name="T:testNDoc.ShowMsg">
<summary>
ShowMsg 的摘要說明。
顯示測試信息的類
</summary>
</member>
<member name="F:testNDoc.ShowMsg.testStr">
<summary>
測試字符串
</summary>
</member>
<member name="M:testNDoc.ShowMsg.ShowMessage(System.String)">
<summary>
顯示信息在信息框中的公有函數
</summary>
<param name="msg">傳遞字符串參數</param>
</member>
<member name="M:testNDoc.ShowMsg.addStr(System.String)">
<summary>
增加幾個字符的私有函數
</summary>
<param name="msg">傳遞字符串參數</param>
<returns>返回處理過的字符串</returns>
</member>
<member name="M:testNDoc.ShowMsg.addOk(System.String)">
<summary>
test addOk
</summary>
<param name="msg"></param>
<returns></returns>
</member>
</members>
</doc>
仔細對比這個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文件中
/// 增加幾個字符的私有函數
/// </summary>
/// <param name="msg">傳遞字符串參數</param>
/// <returns>返回處理過的字符串</returns>
那麼NDoc處理後又是如何的呢?
安裝NDoc後運行程序,選擇程序集和對應的XML文件,如下圖
然後就設置生成文檔的相關參數了
文檔類型目前支持6種:
HtmlHelp2 注意,這種文檔需要安裝Visual Studio Help Integration Kit,可以在微軟網站下載;
JavaDoc 類似於Java API的文檔方式,習慣看Java API的人比較喜歡
LaTeX (alpha)
LinearHtml (alpha)
MSDN
XML
選擇不同的文檔類型需要設置一些不同的參數,這裏選擇HtmlHelp2格式。
可以設置的參數比較多,很多可以使用默認值,每個的作用都可以在下面看到它的解釋,這個例子選擇的設置如下圖:
選擇菜單上的Documentation->Build就可以生成需要的幫助文檔了。
此時就會在NDoc文件所在目錄下生成一個doc目錄,全部生成的文件都放在這個目錄下。
打開NDocTest.chm,看到的效果如下:
這裏可以看到生成的信息並不是單單依賴於上面討論的XML文件,也生成了很多完整的信息,這些信息應該通過反射機制在程序集中讀取的。
對比結果可以看到:
1.生成的CHM只顯示了public和protected,而private則沒有顯示,不管是否在XML有反應;
2.繼承過來的方法也會在CHM中顯示出來;
3.生成的CHM主要以程序集爲基礎,將public和protected的方法顯示出來,而XML主要作爲註釋的參考,例如項目中有些沒有註釋的共
有方法在XML中沒有反應出來,但是在CHM也會顯示出來。
小結:NDoc生成的CHM並沒有完全將項目中的全部註釋抽取出來,但是它作爲生成API文檔則是十分有用的。
另外值得注意的是:
在使用中發現NDoc的同步似乎有些問題,例如第一次生成後,對有些方法做了些修改,註釋的修改可以同步更新,但一些方法的屬性變更並沒有直接反應過去,例如將public改成protected,在生成的CHM中也不會直接反應。
有遇過這個問題或者知道如何解決的高手請指教。
例子代碼可以從這裏下載