2013-07-29 10 views
6

Sto provando a migrare le nostre regole personalizzate FxCop (= Analisi del codice) da Visual Studio 2010 a Visual Studio 2012.Le regole personalizzate FxCop non hanno un nome in VS2012 (ma le regole "ufficiali" hanno un nome)

Finora, funzionano bene, tranne che per una cosa: il loro nome è vuoto nella finestra dei risultati (View ->Other windows ->Code Analysis), solo il CheckId e la Resolution presentarsi, mentre il nome viene mostrato per le regole di Microsoft:

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

Che cosa è strano ge, è che il nome è visibile nell'editor set di regole:

The name is visible on both rules in the ruleset editor

Cosa c'è di sbagliato con le mie regole?

dettagli

Ecco come entrambe le regole appaiono in uscita di MSBuild (c'è qualcosa di sospetto c'è, ma non capisco il motivo per cui ho un messaggio diverso):

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 

Ecco il governare dichiarazione nel file XML per la mia regola:

<?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> 

Ed ecco la dichiarazione di regola nel XML per il dominio di Microsoft.

<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> 

risposta

6

Questo accade perché il nome della regola (in contrapposizione al suo nome tipo di classe) non è contenuta nel messaggio di violazione nella relazione FxCop generato dalla corsa analisi del codice. In teoria, Visual Studio potrebbe (e probabilmente deve) cercare il nome della regola sotto il nodo <Rules> nella relazione prima che cominci a guardare altrove. Tuttavia, lo fa non in VS 2012. Invece, si ottiene solo i nomi delle regole ai dati regola acquisito da complessi di regole caricati.

La cosa più difficile è che, a scopo di visualizzazione dell'interfaccia utente, Visual Studio sta facendo una ricerca completamente separata e il carico di complessi di regole quanto faccia l'analisi del codice viene eseguito. Quest'ultima viene effettuata eseguendo fxcopcmd.exe con una riga di comando generato off proprietà MSBuild. Il primo utilizza logica completamente separato integrato in Visual Studio plugin per analisi del codice, e non ci vuole le posizioni di regole a livello di progetto o file set di regole in considerazione. (Sembra di essere fatto tramite la classe Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider nell'assemblea CodeAnalysis.dll, se siete curiosi di sapere i dettagli scabrosi.)

Quindi ... Che, fondamentalmente, hanno due scelte, se si desidera vedere i nomi delle regole:

  1. Inserire il gruppo di regole nella cartella <VS install directory>\Team Tools\Static Analysis Tools\FxCop\Rules in modo che venga rilevata da Visual Studio.

  2. Aggiungi un nodo registro HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePath (creare una nuova chiave denominata Code Analysis, con uno spazio, invece di utilizzare il già esistente CodeAnalysis) con un valore simile al seguente per consentire sia le regole e le regole incorporate per avere i loro nomi visualizzati: %FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder

+0

Nel mio caso, ho usato 'tag RuleHintPaths' del file' .ruleset' per dare il percorso al mio DLL, ma come dici tu plug-in di VS sembra ignorarlo. Grazie per la risposta, anche se non è quella che mi piacerebbe vedere :). –

+0

Copia i file in ' \ Strumenti del team \ Strumenti di analisi statica \ FxCop \ Rules', ma non è ottimale poiché spesso aggiungiamo o modifichiamo le regole. La chiave di registro era assente sul mio sistema, quindi ho provato a crearla, ma non sembra funzionare. Ho un sistema Windows 7 a 64 bit, la chiave potrebbe essere posizionata da qualche altra parte? Grazie! –

+0

Hai riavviato Visual Studio dopo aver aggiunto la chiave di registro? Inoltre, hai provato ad aggiungere il valore FxCopRulePath sotto la chiave preesistente 'HKEY_CURRENT_USER \ Software \ Microsoft \ VisualStudio \ 11.0 \ CodeAnalysis', o hai creato una nuova chiave' Code Analysis' con uno spazio tra le parole? (Quest'ultimo è necessario). –

Problemi correlati