2012-07-20 93 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