2012-07-20 96 views
1

在我的項目中,我使用自定義控件而不是普通的ASP.NET控件。我們已經在.NET上構建了一個架構,並且正在使用它的控件。FxCop自定義控件的自定義規則

現在我需要編寫一個自定義規則來檢查是否正在使用一些Windows控件。理由是,我的團隊僅限於我的自定義控件,用於替代Windows控件。

例如:我需要搜索,如果他們正在使用System.Windows.Controls.Textbox .....我需要它是一個錯誤。

任何人都可以請幫我用代碼?

我希望問題清楚.....如果需要進一步澄清,請讓我知道。

+0

你曾經寫過一個自定義的FxCop規則嗎?如果是這樣,你是否試圖爲這個問題寫一篇文章? – Bernard 2012-07-21 22:13:36

+0

不。這是我第一次寫FxCop規則,我想了解一些情況。 – user1529679 2012-07-23 12:45:57

+0

參見:http://stackoverflow.com/questions/366095/creating-a-custom-rule-in-fxcop – Bernard 2012-07-23 13:43:00

回答

0

對這種規則的邏輯很簡單:

  1. 檢查方法機構,訪問每個構造函數調用,看看是否 目標類從Control基類繼承。
  2. 如果有,請驗證目標類是否在您的名稱空間或程序集中(或者您可以最好地將其識別爲「您的」)。

這是比較簡單的。一個更大的問題是相關的構造函數通常會在設計器生成的代碼中調用,而大多數人往往更喜歡在執行FxCop時忽略它。爲了使您的規則發揮作用,您需要在分析中包含設計師生成的代碼。

0

工具NDepend讓我們比使用FxCop更容易在.NET代碼上編寫自定義代碼規則。 免責聲明:我是工具

有了這個工具,你可以寫在LINQ查詢自定義代碼規則(什麼被命名爲CQLinq)的開發商之一。例如,你所要求的查詢可以這樣寫有CQLinq:

// <Name>Don't use system controls</Name> 
warnif count > 0 

let systemControls = ThirdParty.Types.Where(
      t => t.DeriveFrom("System.Windows.Forms.Control".AllowNoMatch())) 
where systemControls.Count() > 0 

from t in systemControls 
let methodsThatCreateT = t.TypesUsingMe.ChildMethods().Where(m => m.CreateA(t)) 
select new { t, methodsThatCreateT } 

當編輯這樣的編碼規則,立即可瀏覽的結果顯示(在3毫秒這裏)。雙擊這個結果的任何類型或方法,跳轉到其聲明的源代碼在Visual Studio:

CQLinq don't use system controls

200 default code rules提出了建議。該工具100%集成在Visual Studio 2012,2010和2008中。默認或自定義代碼規則可以是validated inside Visual Studio,和/或在構建過程時間,generated HTML+javascript report