Cómo detectar llamadas a un método ESPECÍFICO en FxCop a través de una regla personalizada: qué poner en el método de verificación

Quiero prohibir las llamadas a un método específico (MessageBox.Show) a través de una regla personalizada de FxCop. Conozco la mecánica de cómo implementar una regla FxCop de forma personalizada (el archivo XML, heredado de BaseIntrospectionRule, etc.) Mi pregunta aquí es qué puse en el método "Comprobar".

A continuación se muestra el borrador inicial que he basado en hurgar mucho en la web, pero estoy muy desconcertado en cuanto a lo que realmente llenaría en los dos campos marcados con ????? debajo.

No estoy seguro de que incluso esta solución, tal como existe, funcione. ¿Cuál es la prueba infalible para asegurarme de que estoy haciendo lo que quiero, que es captar todas las llamadas a 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;
}

preguntado el 03 de mayo de 12 a las 16:05

Las Instrucciones son 'la forma antigua' de escribir las reglas de FxCop. En su lugar, es más fácil utilizar los métodos de visita. Para una regla personalizada escrita por mí que busca llamadas a string.ToString (entre otras), consulte: fxcopcontrib.codeplex.com/SourceControl/changeset/view/… -

El mejor tutorial sobre reglas personalizadas se puede encontrar aquí: binarycoder.net/fxcop/index.html -

2 Respuestas

Es posible que desee ver cómo se crea la regla de SpecificMessageBoxOptions integrada utilizando un descompilador como Reflector. Hay otros enfoques posibles, pero la comparación de nombres suele estar bien, a menos que tenga motivos para creer que provocará un exceso de falsos positivos.

contestado el 03 de mayo de 12 a las 17:05

Encontré buenos ejemplos en 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Team Tools\Static Analysis Tools\FxCop\Rules\' - Maslow

¿Qué tal algo como esto?

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

Respondido 11 Oct 13, 01:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.