0

我想禁止通过自定义 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;
}
4

2 回答 2

1

您可能想看看内置的 SpecifyMessageBoxOptions 规则是如何使用像 Reflector 这样的反编译器构建的。还有其他可能的方法,但名称比较通常没问题,除非您有理由相信它会导致过多的误报。

于 2012-05-03T16:08:56.843 回答
1

这样的事情怎么样?

   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));
    }
于 2013-10-11T00:14:17.850 回答