如何为vs2008编写代码分析工具以防止特定的框架调用,例如GC.WaitForFullGCComplete()或Application.DoEvents()
我尝试在我的自定义规则中覆盖VisitMethodCall,但我无法弄清楚Microsoft.FxCop.Sdk.MethodCall参数中的实际内容。无法在网上找到示例。
有人能指出我正确的方向吗?
答案 0 :(得分:3)
将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;
}
答案 1 :(得分:0)
我记得Debugging book我认为有一章关于FXCop规则,并讨论了如何编写一章。对于我的生活,我找不到我的副本。我怀疑你需要反射器
答案 2 :(得分:-2)
编写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和构建流程时间。
答案 3 :(得分:-3)
虽然它与NDepend,甚至FxCop本身都不匹配,但我刚刚在这里发布了一个非常轻量级的方法,它适用于简单的事情,例如阻止对特定方法的调用:http://activesharp.codeplex.com/wikipage?title=Using%20ActiveSharp%20as%20a%20Unit%20Test%20Tool