0

カスタム FxCop ルールを使用して、特定のメソッド (MessageBox.Show) の呼び出しを禁止したいと考えています。カスタム実装された FxCop ルール (XML ファイル、BaseIntrospectionRule からの継承など) を取得する方法のメカニズムを知っています。ここでの私の質問は、"Check" メソッドに何を入れるかです。

以下は、私が Web をいろいろ調べた結果に基づいて作成した最初のドラフトですが、?????でマークされた 2 つのフィールドに実際に何を入力するかについては非常に困惑しています。下。

このソリューションが存在するとしても、うまくいくかどうかはわかりません。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

このようなものはどうですか?

   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 に答える
1

Reflector のような逆コンパイラを使用して、組み込みの SpecifyMessageBoxOptions ルールがどのように構築されるかを確認することをお勧めします。他にも考えられる方法はありますが、名前の比較は、過剰な誤検知を引き起こすと信じる理由がない限り、通常は問題ありません。

于 2012-05-03T16:08:56.843 に答える