Respuesta

1

Si utiliza el corredor de la consola, puede utilizar un archivo de defecto (fuera de la fuente) para suprimir cualquier defecto en un método, tipo o ensamblaje.

El nuevo Gendarme 2.8 tiene soporte básico (leer incompleto y defectuoso) para el atributo [SuppressMessage] (igual que fxcop). Espere que esta característica funcione correctamente una vez que se libere 2.10.

0

Por lo que puedo ver, no hay forma de que habilite [SuppressMessage] en Gendarme (en 2.8). Agarré la última fuente de GitHub, porque no estaba funcionando como se describe.

SupressMessageEngine está allí en el código, y hay pruebas que lo ejercen a través de una anulación manual de Runner.Engines.Subscribe. Pero el [EngineDependency (typeof (SuppressMessageEngine))] no se aplica a todas las reglas compiladas, que es cómo se suscribe cuando realmente se ejecuta Gendarme.

También miré la fuente para encontrar una manera de suscribirme siempre a un motor en particular a través de config, pero no hay ninguno.

Podría estar equivocado, pero parece un descuido que olvidaron volver atrás y aplicar los atributos apropiados de EngineDependency.

La única "solución alternativa" que se me ocurre es escribir una regla personalizada que, cuando se invoca, agrega una suscripción SuppressMessageEngine y no hace nada más. Hacky sí, pero esto debería trabajo basado en lo que he visto en su código.

FYI - Acabo de implementar esto. Es necesario crear su propia regla personalizada, Mono.Cecil importación y Gendarme.Framework y el marco .NET objetivo de 3,5

using Gendarme.Framework; 
using Gendarme.Framework.Engines; 

namespace MyRules 
{ 
    [Problem("Gendarme devs forgot to attribute rules with SuppressMessageEngine")] 
    [Solution("Include this rule")] 
    [EngineDependency(typeof(SuppressMessageEngine))] 
    public class AddSuppressMessageSupportRule : Rule {} 
} 

Lamentablemente, esto no va a tirar en los atributos de FxCopCompatibility que son allí (es decir, un SupressMessage para una regla de FxCop que coincida con una regla de Gendarme también se suprimirá la regla de Gendarme), pero al menos le permite usar los nombres de Gendarme para suprimir.

5

Como ya se señaló, la versión 2.10 admite el atributo [SuppressMessage].

Por ejemplo, para suprimir la regla AvoidNonAlphanumericIdentifierRule, hacer esto:

[SuppressMessage("Gendarme.Rules.Naming", "AvoidNonAlphanumericIdentifierRule")] 
protected void Application_Start() 
{ 
    ... 
} 

Tenga en cuenta que es necesario especificar el nombre de la asamblea en la que vive la regla ... en este caso, AvoidNonAlphanumericIdentifierRule vive en Gendarme. Rules.Naming.dll. La lista completa de reglas y sus nombres de ensamblado son here.

+5

Se debe tener en cuenta que el ensamblado debe compilarse con el símbolo 'CODE_ANALYSIS' definido [para que esto funcione] (http://www.mono-project.com/Gendarme.FAQ#Why_are_defects_decorated_using_.5BSuppressMessage.5D_attributes_still_showing_in_my_reports_.3F) –

+0

Además, las últimas versiones agregan compatibilidad FxCop, por lo que si ya tiene un SuppressMessage de FxCop y tiene una regla equivalente en Gendarme, el mensaje será suprimido. –

Cuestiones relacionadas