【问题标题】:FxCop Custom Rules for Custom Controls自定义控件的 FxCop 自定义规则
【发布时间】:2012-07-20 14:07:49
【问题描述】:

在我的项目中,我使用的是自定义控件而不是普通的 ASP.NET 控件。我们已经在 .NET 上构建了一个架构,并正在使用它的控件。

现在我需要编写一个自定义规则来检查是否正在使用某些 Windows 控件。原因是,我的团队需要仅限于我的自定义控件,这些控件旨在替换 Windows 控件。

示例:我需要搜索,如果他们使用 System.Windows.Controls.Textbox .....我需要它是一个错误。

谁能帮我写代码?

我希望问题很清楚.....如果需要进一步澄清,请告诉我。

【问题讨论】:

  • 您之前是否编写过自定义 FxCop 规则?如果是这样,您是否尝试为这个问题写一篇文章?
  • 没有。这是我第一次编写 FxCop 规则,我想了解一下。

标签: visual-studio-2010 c#-4.0 fxcop


【解决方案1】:

这种规则的逻辑相当简单:

  1. 检查方法体,访问每个构造函数调用以查看是否 目标类继承自 Control 基类。
  2. 如果是,请验证目标类是否在您的命名空间或程序集中(或者您最好将其标识为“您的”)。

这个比较简单。一个更大的问题是,通常会在设计器生成的代码中调用相关的构造函数,而大多数人在执行 FxCop 时倾向于忽略这些代码。要使您的规则生效,您需要在分析中包含设计器生成的代码。

【讨论】:

    【解决方案2】:

    NDepend 工具让我们在 .NET 代码上编写自定义代码规则比使用 FxCop 更容易。 免责声明:我是该工具的开发者之一

    使用此工具,您可以针对 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 源代码中的声明:

    200 default code rules 被提议。该工具 100% 集成在 Visual Studio 2012、2010 和 2008 中。默认或自定义代码规则可以是 validated inside Visual Studio,和/或在构建过程时,在 generated HTML+javascript report 中。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多