日常工作中,需要為程序集提供統計分析:
1:程序集方法數;
2:開發人員數目及各自所開發或REVIEW的方法數;
3:測試中,被標注有BUG的數目;
4:直接查看方法的IL代碼;
鑒於以上統計的需要,特開發本EXE。
1:關於特性Attribute的知識補充
"Attribute是一種可由用戶自由定義的修飾符(ModifIEr),可以用來修飾各種需要被修飾的目標"。它的作用是為它們的修飾目標追加上一些額外的信息——比如"這個類是我寫的"或者"這個函數以前出過問題"等等。
它跟注釋的區別是:注釋是對程序源代碼的一種說明,主要目的是給人看的,在程序被編譯的時候會被編譯器所丟棄,因此,它絲毫不會影響到程序的執行。而Attribute是程序代碼的一部分,不但不會被編譯器丟棄,而且還會被編譯器編譯進程序集(Assembly)的元數據(Metadata)裡,在程序運行的時候,你隨時可以從元數據裡提取出這些附加信息來決策程序的運行。
本文所依據的就是特性這個特點。
2:基礎模塊XP.AttributeClass
根據文章開頭的要求:統計開發者、reviewer、bug信息,需要創建一個可被客戶端項目引用的類庫項目XP.AttributeClass。該項目包含三個Attribute類:CreaterAttribute、RevIEwerAttribute、BugAttribute。分別如下:
3:引用XP.AttributeClass
在我們自己的程序集中,需要為自己的類或方法加上這類特性,參考如下:
- [CreaterAttribute("join", "2010年12月14日")]
- class class1
- {
- [CreaterAttribute("join", "2010年12月14日")]
- [BugAttribute(true, "2010年12月14日")]
- [RevIEwerAttribute("hy", "2010年12月14日")]
- private void Test1()
- {
- }
- [RevIEwerAttribute("hy", "2010年12月14日")]
- public void Test2()
- {
- }
- public void Test3()
- {
- } }
4:統計分析模塊XP.CodeStatistics
XP.CodeStatistics是本工具的核心模塊,包括了四個功能:獲取程序集、獲取IL代碼、統計分析。核心類如下,本文不再贅述,請直接查看源碼。
5:生成報表
由於對客戶端程序集添加了如上的特性信息的,所以,通過分析程序集,我們可以很方法得到如下的報表:
備注:從項目管理的角度來說,本報表,僅僅是對工作量和代碼質量的一個輔助參考,但有此參考,會比沒有好。
6:IL代碼查看
細心的人,可能已經發現,上表所統計的僅僅是IL的代碼行數,而不是實際代碼行數。這是因為:
1:首先,本分析工具是對程序集進行分析。所謂程序集,就是編譯為IL代碼的托管代碼;
2:理論上,從IL代碼能反編譯為托管代碼(就像Reflactor一樣),但是,太復雜了,我們沒有去實現;
3:即使反編譯IL代碼,得到的也不是原始的代碼。如果要分析原始代碼的,可以采用其它現成工具。
所以,既然我們統計的是IL代碼,所以,本工具的一個輔助功能就是IL代碼的查看。本工具主頁面:
- [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
- public class CreaterAttribute : Attribute
- {
- public CreaterAttribute(string creater, string createDate)
- {
- Creater = creater;
- CreateDate = createDate;
- }
- public string Creater { get; private set; }
- public string CreateDate { get; private set; }
- }
- [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
- public class RevIEwerAttribute : Attribute {
- public RevIEwerAttribute(string revIEwer, string revIEwDate)
- {
- Reviewer = revIEwer;
- ReviewDate = revIEwDate;
- }
- public string RevIEwer { get; private set; }
- public string RevIEwDate { get; private set; }
- }
- [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
- public class BugAttribute : Attribute
- {
- public BugAttribute(bool isBug, string bugDate) {
- this.IsBug = isBug;
- this.BugDate = bugDate;
- }
- public bool IsBug { get; private set; }
- public string BugDate { get; private set; }
- }
關於C#特性Attribute的知識,初步先講到這裡,希望本文對您能起到作用。
原文鏈接:http://www.cnblogs.com/luminji/archive/2010/12/29/1920452.Html
【編輯推薦】