Antwort

1

Wenn Sie den Console Runner verwenden, können Sie eine defekte Datei (out-of-source) verwenden, um Fehler in einer Methode, einem Typ oder einer Baugruppe zu unterdrücken.

Der neue Gendarme 2.8 hat grundlegende (lesen unvollständige und fehlerhafte) Unterstützung für das Attribut [SuppressMessage] (wie fxcop). Erwarten Sie, dass diese Funktion ordnungsgemäß funktioniert, sobald 2.10 veröffentlicht wurde.

0

Soweit ich sehen kann, gibt es keine Möglichkeit zu aktivieren [SuppressMessage] in Gendarme (bei 2,8). Ich habe mir die neueste Quelle von GitHub geschnappt, weil sie nicht wie beschrieben funktionierte.

Die SupressMessageEngine ist im Code enthalten und es werden Tests durchgeführt, die eine manuelle Außerkraftsetzung von Runner.Engines.Subscribe durchführen. Aber die [EngineDependency (typeof (SuppressMessageEngine))] wird nicht auf alle kompilierten Regeln angewendet, so wie sie abonniert wird, wenn Gendarme tatsächlich ausgeführt wird.

Ich schaute auch auf die Quelle, um einen Weg zu finden, immer eine bestimmte Engine über Config abonnieren - aber es gibt keine.

Ich könnte falsch liegen, aber es sieht aus wie ein Versehen, dass sie vergessen haben, zurückzugehen und die entsprechenden EngineDependency-Attribute anzuwenden.

Der einzige "Workaround", den ich mir vorstellen kann, ist eine benutzerdefinierte Regel zu schreiben, die, wenn sie aufgerufen wird, ein Abonnement SuppressMessageEngine hinzufügt und nichts anderes tut. Hacky ja, aber das sollte arbeiten basierend auf was ich in ihrem Code gesehen habe.

FYI - Just dies implementiert. Sie müssen Ihre eigene benutzerdefinierte Regel, Import Mono.Cecil und Gendarme.Framework und Ziel .NET Framework 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 {} 
} 

Leider erstellen, diese ziehen nicht in dem FxCopCompatibility Attributen, die sind dort (dh ein SupressMessage für eine FxCop-Regel, die mit einer Gendarm-Regel übereinstimmt, unterdrückt auch die Gendarm-Regel), aber zumindest können Sie die Gendarmen-Namen zum Unterdrücken verwenden.

5

Wie bereits erwähnt, unterstützt Version 2.10 das [SuppressMessage] -Attribut.

Zum Beispiel der AvoidNonAlphanumericIdentifierRule Regel zu unterdrücken, dies tun:

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

Beachten Sie, dass Sie den Namen der Assembly angeben müssen, wo die Regel lebt ... in diesem Fall lebt AvoidNonAlphanumericIdentifierRule in Gendarme. Rules.Naming.dll. Die vollständige Liste der Regeln und ihrer Assemblynamen lautet here.

+5

Es sollte beachtet werden, dass die Baugruppe mit dem 'CODE_ANALYSIS' Symbol [für diese arbeiten] definiert kompiliert werden müssen (http://www.mono-project.com/Gendarme.FAQ#Why_are_defects_decorated_using_.5BSuppressMessage.5D_attributes_still_showing_in_my_reports_.3F). –

+0

Auch die neuesten Versionen fügen FxCop-Kompatibilität hinzu. Wenn Sie also bereits eine SuppressMessage von FxCop haben und eine entsprechende Regel in Gendarme haben, wird die Nachricht unterdrückt. –