2012-05-03 11 views
0

カスタムFxCopルールを使用して特定のメソッド(MessageBox.Show)への呼び出しを拒否したいとします。私は、FxCopルールをカスタム実装(XMLファイル、BaseIntrospectionRuleなどを継承したもの)する方法の仕組みを知っています。私の質問は、ここで私が "Check"メソッドに入れたものです。以下はカスタムルールを使用してFxCopの特定のメソッドへの呼び出しを検出する方法 - チェックメソッド

は、私は、ウェブ上で多くのチャンスをうかがっに基づいている最初のドラフトですが、私は私が実際にの付いた二つのフィールドに移入なるのかに関しては非常に困惑してい?????以下。

私は、このソリューションでさえ、存在するとしても機能するかどうかはわかりません。 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; 
} 
+0

この手順は、FxCopルールを書くための「古い方法」です。代わりに訪問メソッドを使用する方が簡単です。私が書いたカスタムルールでは、string.ToString(他のものの中でも)の呼び出しを参照してください。https://fxcopcontrib.codeplex.com/SourceControl/changeset/view/7476#37972 – jessehouwing

+0

カスタムルールに関するベストチュートリアルここにあります:http://www.binarycoder.net/fxcop/index.html – jessehouwing

答えて

1

あなたは、組み込みのSpecifyMessageBoxOptionsルールリフレクターのような逆コンパイラを使用して構築されている方法を見てみたいことがあります。他にも考えられるアプローチがありますが、名前の比較は、過度の誤検出を引き起こすと思われる理由がない限り、通常は問題ありません。

+0

うわー、すばらしい、ありがとう。私はそれを試して、報告します。 –

+0

C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Team Tools \静的解析ツール\ FxCop \ Rules \ – Maslow

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)); 
    }