如何编写代码分析 (FxCop) 规则以防止方法调用

Posted

技术标签:

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

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

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

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

【问题讨论】:

我在这里找到了答案:nervoustych.com/blog/CategoryView,category,Coding,FxCop.aspx 这个人使用了 Check() 方法的“正常”覆盖,然后在 Method 的情况下,循环遍历每条指令寻找调用,然后匹配用全名打电话。 这个链接失效了,有更新的链接吗? 这是来自waybackmachine 的死链接:web.archive.org/web/20090909101353/http://www.nervoustych.com/… 【参考方案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

【讨论】:

您最好将相关代码粘贴到您的答案中,以便我们以独立的方式对其进行评估

以上是关于如何编写代码分析 (FxCop) 规则以防止方法调用的主要内容,如果未能解决你的问题,请参考以下文章

如何让 FxCop 拥有与 Visual Studio 代码分析相同的规则集?

FxCop(/VS2010 代码分析),可以将方法结果标记为 IDisposable 的“现在调用者责任”吗?

使用 FxCop 获得百分比代码覆盖率

如何在所有开发者之间共享 FxCop 规则?

FxCop 自定义规则检查命名空间

有没有办法在 FxCop 10.0 中获取 CAT.NET 规则