【问题标题】:How to write Code Analysis (FxCop) rule to prevent a method call如何编写代码分析 (FxCop) 规则以防止方法调用
【发布时间】:2009-03-16 01:13:25
【问题描述】:

如何为vs2008编写代码分析工具来防止特定的框架调用,例如GC.WaitForFullGCComplete()或Application.DoEvents()

我尝试在我的自定义规则中覆盖 VisitMethodCall,但我无法弄清楚 Microsoft.FxCop.Sdk.MethodCall 参数中的真正含义。在网络上找不到示例。

有人能指点我正确的方向吗?

【问题讨论】:

标签: .net fxcop


【解决方案1】:

System.Web.HttpUtility.HtmlEncode(System.String) 替换为您尝试查找和阻止的方法签名。

    public override ProblemCollection Check(Member member)
    {
        if (member is Method)
        {
            var callees = new List<Method>(Callees.CalleesFor((Method)member));
            foreach (var callee in callees)
            {
                if (callee.FullName == "System.Web.HttpUtility.HtmlEncode(System.String)")
                {
                    Problems.Add(new Problem(GetResolution()));
                }
            }
        }

        return Problems;
    }

【讨论】:

  • 这是否还会选择在派生类中覆盖 HtmlEncode 的方法?
  • @Tharwen,这只会找到对指定签名的调用:System.Web.HttpUtility.HtmlEncode(System.String)
  • @slolife 这也适用于构造函数吗?如果我想阻止使用TimeoutException 的构造函数,将System.Web.HttpUtility.HtmlEncode(System.String) 替换为System.TimeoutException.TimeoutException(System.String) 就足够了吗?
  • @OscarVasquez,我不知道。我确信它适用于构造函数,但是,我不知道它们的语法是什么。
【解决方案2】:

我记得Debugging book 有一个关于 FXCop 规则的章节并讨论了如何编写一个。对于我的一生,我找不到我的副本。我怀疑你需要反射器

【讨论】:

    【解决方案3】:

    编写 FxCop 规则的麻烦的替代方法是使用工具 NDepend。此工具可让您编写 C# LINQ 查询上的代码规则 what we call CQLinq免责声明:我是该工具的开发人员之一

    默认建议超过200 code rules。得益于众所周知的 C# LINQ 语法,自定义现有规则或创建自己的规则非常简单。

    如何为vs2008编写代码分析工具来防止特定的框架调用,例如GC.WaitForFullGCComplete()或Application.DoEvents()

    对于这个特殊的需求,下面的简单 CQLinq 规则就足够了(注意AllowNoMatch() 的用法,让这个规则在任何情况下都有效):

    // <Name>Don't call these methods</Name>
    warnif count > 0
    from m in Methods 
    where m.IsUsing ("System.GC.WaitForFullGCComplete()".AllowNoMatch()) ||
          m.IsUsing ("System.GC.WaitForFullGCComplete(Int32)".AllowNoMatch()) ||
          m.IsUsing ("System.Windows.Forms.Application.DoEvents()".AllowNoMatch())
    select m
    

    CQLinq 查询可以在 VisualStudio 中实时编辑,并提供即时结果,并带有结果浏览功能:

    让我们明确一点,规则可以在live in Visual Studio 和构建过程中通过generated HTML+javascript report 进行验证。

    【讨论】:

      【解决方案4】:

      虽然它与 NDepend 甚至 FxCop 本身都不匹配,但我刚刚在这里发布了一个非常轻量级的方法,它非常适用于阻止调用特定方法等简单的事情:http://activesharp.codeplex.com/wikipage?title=Using%20ActiveSharp%20as%20a%20Unit%20Test%20Tool

      【讨论】:

      • 您最好将相关代码粘贴到您的答案中,以便我们以独立的方式对其进行评估
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多