2013-07-29 5 views
6

Ich versuche, unsere benutzerdefinierten FxCop (= Code Analysis) -Regeln von Visual Studio 2010 zu Visual Studio 2012 zu migrieren.FxCop-benutzerdefinierte Regeln haben keinen Namen in VS2012 (aber "offizielle" Regeln haben einen Namen)

Bisher sie außer eine Sache gut funktionieren: ihr Name ist leer, im Ergebnisfenster (View ->Other windows ->Code Analysis) nur die CheckId und die Resolution zeigen, während der Name für Microsofts Regeln angezeigt:

The name isn't visible on the right of the CheckId on the custom rule, but is visible on the Microsoft rule.

Was ist stran ge ist, dass der Name ist sichtbar im ruleset Editor:

The name is visible on both rules in the ruleset editor

Was mit meinen Regeln falsch?

Einzelheiten

Hier ist, wie beide Regeln in MSBuild die Ausgabe zeigen (es ist etwas faul da, aber ich verstehe nicht, warum ich eine andere Botschaft haben):

6>c:\Users\Me\MySolution\MyProject\Program.cs(15): warning : CA1804 : Microsoft.Performance : 'Foo<T>.SomeMethod()' declares a variable, 'z', of type 'int', which is never used or is only assigned to. Use this variable or remove it. 
6>MSBUILD : warning : CF1001 : CustomRules.ThreadSafety : The public Public Field "Tests.Program.Foo" must be preceded of readonly 

Hier ist die Regeldeklaration in der XML-Datei für meine Regel:

<?xml version="1.0" encoding="utf-8" ?> 
<Rules FriendlyName="CustomRules"> 
    <Rule TypeName="PublicFieldsMustBeReadonly" Category="CustomRules.ThreadSafety" CheckId="CF1001"> 
    <Name>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Name> 
    <Description>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Description> 
    <GroupOwner>MyCompany</GroupOwner> 
    <DevOwner>Me</DevOwner> 
    <Owner>Me</Owner> 
    <Url>http://example.com</Url> 
    <Resolution>The public Public Field "{0}" must be preceded of readonly</Resolution> 
    <Email>[email protected]</Email> 
    <MessageLevel Certainty="100">Warning</MessageLevel> 
    <FixCategories>Breaking</FixCategories> 
    </Rule> 
</Rules> 

Und hier ist die Regel Deklaration in der XML für Microsoft-Regel.

<Rules FriendlyName="Performance Rules"> 
    <Rule TypeName="RemoveUnusedLocals" Category="Microsoft.Performance" CheckId="CA1804"> 
    <Name> 
     Remove unused locals 
    </Name> 
    <Description> 
     Remove locals that are not used or are only assigned to in method implementations. 
    </Description> 
    <Url> 
     @ms182278(VS.100).aspx 
    </Url> 
    <Resolution> 
     {0} declares a variable, {1}, of type {2}, which is never used or is only assigned to. Use this variable or remove it. 
    </Resolution> 
    <Email /> 
    <MessageLevel Certainty="95"> 
     Warning 
    </MessageLevel> 
    <FixCategories> 
     NonBreaking 
    </FixCategories> 
    <Owner /> 
    </Rule> 
</Rules> 

Antwort

6

Dies geschieht, weil der Name der Regel (im Gegensatz zu seiner Klasse Typnamen im Gegensatz) ist nicht in der Verletzung Nachricht in dem Bericht des Code-Analyse-Lauf erzeugt FxCop enthalten. Theoretisch könnte (und sollte) Visual Studio den Namen der Regel unter dem Knoten <Rules> im Bericht suchen, bevor er sich an anderer Stelle umsehen kann. In VS 2012 ist dies jedoch nicht der Fall. Stattdessen werden die Regelnamen nur aus Regelinformationen abgerufen, die von geladenen Regelassemblys abgerufen wurden.

Die heikle Sache hier ist, dass Visual Studio für UI-Anzeigezwecke eine vollständig separate Suche und das Laden von Regelassemblies durchführt, als in den Code Analysis ausgeführt wird. Letzteres wird ausgeführt, indem fxcopcmd.exe mit einer Befehlszeile ausgeführt wird, die aus MSBuild-Eigenschaften generiert wird. Die erste verwendet eine vollständig separate Logik, die in die Visual Studio-Plugins für die Codeanalyse eingebettet ist, und berücksichtigt nicht die Regelstandorte oder Regelsatzdateien auf Projektebene. (Es scheint, über die Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider Klasse in der CodeAnalysis.dll Montage durchgeführt werden, wenn Sie über die blutigen Details neugierig sind.)

So ... Sie haben grundsätzlich zwei Möglichkeiten, wenn Sie die Regelnamen sehen möchten:

  1. Setzen Sie Ihre Regelbaugruppe in den Ordner <VS install directory>\Team Tools\Static Analysis Tools\FxCop\Rules, damit sie von Visual Studio übernommen wird.

  2. hinzufügen HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePath Registrierungs Knoten (Erstellen Sie einen neuen Schlüssel Code Analysis genannt, mit einem Raum, anstelle der bestehenden CodeAnalysis der Verwendung) mit einem Wert wie die folgenden beiden Ihre Regeln und die integrierten Regeln zu erlauben, ihre Namen zu haben angezeigt: %FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder

+0

In meinem Fall habe ich die '' .ruleset' RuleHintPaths' Tag-Datei, um den Pfad zu meiner DLL zu geben, aber wie Sie VS Plugin sagen, scheint es zu ignorieren. Danke für die Antwort, auch wenn es nicht die ist, die ich gerne sehen würde :). –

+0

Kopieren Sie die Dateien in ' \ Team Tools \ Statische Analysetools \ FxCop \ Rules', aber es ist suboptimal, da wir oft Regeln hinzufügen oder optimieren. Der Registrierungsschlüssel war auf meinem System nicht vorhanden, also habe ich versucht, es zu erstellen, aber es scheint nicht zu funktionieren. Ich habe ein Windows 7 64-Bit-System, könnte der Schlüssel woanders liegen? Vielen Dank! –

+0

Haben Sie Visual Studio nach dem Hinzufügen des Registrierungsschlüssels neu gestartet? Haben Sie außerdem versucht, den FxCopRulePath-Wert unter dem bereits vorhandenen Schlüssel "HKEY_CURRENT_USER \ Software \ Microsoft \ VisualStudio \ 11.0 \ CodeAnalysis" hinzuzufügen, oder haben Sie einen neuen Schlüssel "Code Analysis" mit einem Leerzeichen zwischen den Wörtern erstellt? (Letzteres ist notwendig.) –