如何通过自定义规则检测对 FxCop 中特定方法的调用 - 在 Check 方法中放入什么
本文关键字:方法 调用 Check 什么 规则 自定义 何通过 检测 FxCop | 更新日期: 2023-09-27 18:33:09
我想禁止通过自定义FxCop规则调用特定方法(MessageBox.Show)。我知道如何自定义实现 FxCop 规则的机制(XML 文件、继承自 BaseIntrospectionRule 等)我这里的问题是我在"检查"方法中输入了什么。
以下是我在网上大量搜索的初稿,但我对下面标有?????的两个字段中实际填充的内容感到非常困惑。
我不确定即使是现有的这个解决方案也会起作用。什么是万无一失的,以确保我正在做我想做的事情 - 即捕获对MessageBox.Show的所有调用?
public override ProblemCollection Check(Member member)
{
Method method = member as Method;
if (method == null)
{
return null;
}
MetadataCollection<Instruction>.Enumerator enumerator = method.Instructions.GetEnumerator();
while (enumerator.MoveNext())
{
Instruction current = enumerator.Current;
switch (current.OpCode)
{
case OpCode.Call:
case OpCode.Callvirt:
{
Method method3 = current.Value as Method;
if (method3 == **?????**)
{
Problem item = new Problem(base.GetResolution(**?????**), current);
base.Problems.Add(item);
}
break;
}
}
}
return base.Problems;
}
您可能想看看内置的 SpecifyMessageBoxOptions 规则是如何使用反编译器(如 Reflector)构建的。 还有其他可能的方法,但名称比较通常很好,除非您有理由相信它会导致过多的误报。
这样的事情怎么样?
public override ProblemCollection Check(Member member)
{
Method method = member as Method;
if (method != null)
{
this.Visit(method.Body);
}
return this.Problems;
}
public override void VisitMethodCall(MethodCall call)
{
base.VisitMethodCall(call);
Method targetMethod = (Method)((MemberBinding)call.Callee).BoundMember;
if (targetMethod.Name.Name.Contains("MessageBox.Show"))
this.Problems.Add(new Problem(this.GetResolution(), call));
}