如何编写代码分析 (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 代码分析相同的规则集?