參考:StyleCopSDK.chm與 Byeah的 編寫StyleCop自定義規則教程(一)---編寫中文備註的簡單校驗規則html
1.創建「類庫」類型的C#項目工具
2.加入 Microsoft.StyleCop.dll 與 Microsoft.StyleCop.CSharp.dll 的引用post
3.增長一個類,繼承於:SourceAnalyzer,並帶有 [SourceAnalyzer(typeof(CsParser))] 標題頭。this
4.重寫AnalyzeDocument方法url
5.使用WalkDocument遍歷代碼,並執行指定的方法spa
6.創建與類同名的XML文件命令行
編譯,生成 DLL
放到C:\Program Files\Microsoft StyleCop 4.3
打開VS2008,便可讓規則生效調試
編號定義:飛鵬替換規則爲 FP+原編號,飛鵬新規則爲 FPN+100開始的編號orm
已生效的,VS2008 打開的狀況下,就不能刪除了。(之前認爲已生效的,要失效一次,再生效一次,是否是CACHE形成的誤解)htm
如何調試?
生成,拷貝到stylecop目錄,啓動VS2008,執行 StyleCop
在生成後事件命令行輸入以下內容會方便不少:
copy "$(TargetDir)$(TargetName).*" "C:\Program Files\Microsoft StyleCop 4.3" /y
element 這個對象必須很是熟悉
代碼若是沒有變動,檢測也是假的,調試不會中斷。要把使用 cache 關掉
=====跟蹤
[證實是錯的]若是已被系統檢查了,就不會產生中斷了。(例如 SA1623開啓時,FP1623就不會中斷)
VS2008打開時,原來註冊的,如今卻沒法取消
VS產生的XML文件格式與記事本產生的有一些不一樣(都是 UTF-8)
XML是包含在DLL的資源中,而不是分紅兩個文件
代碼分析:
執行 WalkDocument 時,StyleCop 調用 CodeWalker<T>.Start(靜態方法)
(反射工具備一個錯誤:查找 CodeWalker.Start 的 User By 時,只找到 CSharp.Expression.WalkExpression 調用它,實際上 CsDocument類 的 WalkDocument 方法也有調用)
Start時,創立一個 CodeWalker 實例。
創立實例時,又執行 this.WalkElement
WalkElement裏面代碼以下:
private bool WalkElement(CsElement element, CsElement parentElement, T context)
{
if (element != null)
{
// 元素不爲空時
// 第一次調用時,context 爲空
T local = context;
if (!this.VisitElement(element, parentElement, ref local))
{
// 查看元素,返回 false 時
return false;
}
foreach (Statement statement in element.ChildStatements)
{
// 對元素的每個表達式進行檢查
if (!this.WalkStatement(statement, null, null, element, local))
{
return false;
}
}
foreach (CsElement element2 in element.ChildElements)
{
// 對元素的每個子類進行檢查
if (!this.WalkElement(element2, element, local))
{
return false;
}
}
}
// 返回 true,讓下一個子類檢查得以繼續
return true;
}
第一次進入時,元素即 CsDocument.RootElement(Namespace{}),
VisitElement裏面代碼以下:
private bool VisitElement(CsElement element, CsElement parentElement, ref T context)
{
if (this.elementCallback != null)
{
return this.elementCallback(element, parentElement, context);
}
return true;
}
elementCallback 就是咱們本身寫的子程序了。
如今的擔憂,若是咱們寫的代碼沒有像原規則那樣考慮那麼多問題,怎麼辦?
不過,反射工具能夠提供內部全部代碼:
裝載 Microsoft.StyleCop.CSharp.Rules.dll
先搜索 AnalyzeDocument (它的作法與咱們的作法是同樣的)找到DocumentationRules的那個(由於 SA1603在DocumentationRules中)
Microsoft.StyleCop.CSharp.DocumentationRules.AnalyzeDocument(CodeDocument) : Void
裏面有一個代碼:
this.CheckElementDocumentation(document2);
中間也是用 WalkDocument
document.WalkDocument<AnalyzerSettings>(new CodeWalkerElementVisitor<AnalyzerSettings>(this.CheckDocumentationForElement), context);
註冊的內容爲:CheckDocumentationForElement,點下去,
對於屬性,它有:this.CheckHeader(element, settings, false);
接着對於有頭內容的,它執行: this.ParseHeader(element, element.Header, element.LineNumber, partialElement);
ParseHeader,對屬性的處理代碼以下:
else if (element.ElementType == ElementType.Property)
{
this.CheckPropertyValueTag(element, doc);
this.CheckPropertySummaryFormatting(element as Property, doc);
}
這時,進入關鍵的代碼:CheckPropertySummaryFormatting
這個就是網頁中(http://www.cnblogs.com/Byeah/archive/2011/06/27/2091222.html)體現的代碼,放心了,咱們的代碼就是抄它的。