2009-03-16 5 views
6

¿Cómo escribo una herramienta de análisis de código para VS2008 para evitar una llamada marco específico, como por ejemplo GC.WaitForFullGCComplete() o() Application.DoEventsCómo escribir análisis de código de reglas (FxCop) para evitar una llamada al método

Intenté sobreescribir VisitMethodCall en mi regla personalizada, pero no puedo entender qué tiene realmente el parámetro Microsoft.FxCop.Sdk.MethodCall. No se pudo encontrar un ejemplo en la web.

¿Alguien puede indicarme la dirección correcta?

+0

he encontrado la respuesta aquí: http://nervoustych.com/blog/CategoryView,category,Coding,FxCop.aspx Esta persona utiliza la anulación "normal" del método de verificación(), y luego en el caso de un Método, recorre cada instrucción buscando llamadas, luego coincide con la llamada con un nombre completo. – Bill

+4

este enlace parece estar muerto, ¿hay un enlace actualizado? – Maslow

+0

Aquí está el enlace inactivo de waybackmachine: https://web.archive.org/web/20090909101353/http://www.nervoustych.com/blog/CategoryView,category,Coding%2CFxCop.aspx – slolife

Respuesta

0

Recuerdo un Debugging book que creo que tenía un capítulo sobre reglas de FXCop y discutí cómo escribir uno. Por mi vida no puedo encontrar mi copia. Y sospecho que necesitará el reflector

-2

Una alternativa al desastre de escribir las reglas de FxCop sería usar la herramienta NDepender. Esta herramienta permite escribir Reglas de código sobre C# LINQ consultaswhat we call CQLinq. Descargo de responsabilidad: soy uno de los desarrolladores de la herramienta

Más de 200 code rules se han propuesto por defecto. La personalización de las reglas existentes o la creación de sus propias reglas es sencilla gracias a la conocida sintaxis C# LINQ.

¿Cómo se escribe una herramienta de análisis de código para VS2008 para evitar una llamada marco específico, como por ejemplo GC.WaitForFullGCComplete() o Application.DoEvents()

Para esta necesidad en particular, el simple siguiente CQLinq regla es suficiente (nótese el uso de AllowNoMatch() para hacer este trabajo regla en cualquier situación):

// <Name>Don't call these methods</Name> 
warnif count > 0 
from m in Methods 
where m.IsUsing ("System.GC.WaitForFullGCComplete()".AllowNoMatch()) || 
     m.IsUsing ("System.GC.WaitForFullGCComplete(Int32)".AllowNoMatch()) || 
     m.IsUsing ("System.Windows.Forms.Application.DoEvents()".AllowNoMatch()) 
select m 

consultas CQLinq se pueden editar en vivo en VisualStudio y ofrecer resultados instantáneos, con funciones de consulta de resultados:

enter image description here

de precisión que las reglas pueden ser verificados live in Visual Studio y en el tiempo de construcción de procesos, en un generated HTML+javascript report Let.

3

Reemplazar System.Web.HttpUtility.HtmlEncode(System.String) con el método firma que estás tratando de encontrar y prevenir.

public override ProblemCollection Check(Member member) 
    { 
     if (member is Method) 
     { 
      var callees = new List<Method>(Callees.CalleesFor((Method)member)); 
      foreach (var callee in callees) 
      { 
       if (callee.FullName == "System.Web.HttpUtility.HtmlEncode(System.String)") 
       { 
        Problems.Add(new Problem(GetResolution())); 
       } 
      } 
     } 

     return Problems; 
    } 
+0

¿Esto también recogerá los métodos que anulan HtmlEncode en las clases derivadas? – Tharwen

+0

@Tharwen, esto solo encontrará llamadas a la firma especificada: System.Web.HttpUtility.HtmlEncode (System.String) – slolife

+0

OK, gracias. Tendré que encontrar otra forma – Tharwen

Cuestiones relacionadas