2013-07-29 4 views
6

मैं विजुअल स्टूडियो 2010 से विजुअल स्टूडियो 2012 से हमारे कस्टम FxCop (= कोड विश्लेषण) नियमों को माइग्रेट करने का प्रयास कर रहा हूं।FxCop कस्टम नियमों का नाम VS2012 में नहीं है (लेकिन "आधिकारिक" नियमों का नाम है)

अब तक, वे एक बात के लिए छोड़कर अच्छा काम: उनके नाम परिणाम विंडो में खाली है (->Other windows - View>Code Analysis), केवल CheckId और Resolution, दिखाई, जबकि नाम माइक्रोसॉफ्ट के नियमों के लिए दिखाया गया है:

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

स्ट्रैन क्या है

The name is visible on both rules in the ruleset editor

मेरे नियमों के साथ गलत है: जीई, उस नाम नियम-सेट संपादक में दिख रहा है है?

विवरण

यहाँ कैसे दोनों नियमों MSBuild के उत्पादन में दिखाई है (वहाँ कुछ गड़बड़ वहाँ है, लेकिन मुझे समझ नहीं आता क्यों मैं एक अलग संदेश है):

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 

यहाँ है मेरा नियम के लिए शासन एक्सएमएल फ़ाइल में घोषणा:

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

और यहाँ माइक्रोसॉफ्ट के शासन के लिए एक्सएमएल में शासन घोषणा है।

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

उत्तर

6

यह इसलिए होता है क्योंकि नियम का नाम (के रूप में अपने वर्ग प्रकार नाम के खिलाफ) कोड विश्लेषण रन द्वारा उत्पन्न FxCop रिपोर्ट में उल्लंघन संदेश में मौजूद नहीं है। सिद्धांत रूप में, दृश्य स्टूडियो कहीं और दिखने से पहले रिपोर्ट में <Rules> नोड के तहत नियम नाम की तलाश कर सकता है (और शायद चाहिए)। हालांकि, यह वीएस 2012 में नहीं है। इसके बजाय, इसे लोड नियम असेंबली से प्राप्त नियम जानकारी से केवल नियम नाम मिलते हैं।

यहां मुश्किल बात यह है कि, यूआई डिस्प्ले उद्देश्यों के लिए, विजुअल स्टूडियो कोड विश्लेषण विश्लेषण में किए गए नियमों की तुलना में पूरी तरह अलग खोज और लोड असेंबली लोड कर रहा है। उत्तरार्द्ध MSBuild गुणों से उत्पन्न कमांड लाइन के साथ fxcopcmd.exe चलाकर किया जाता है। पूर्व कोड विश्लेषण के लिए विजुअल स्टूडियो प्लगइन्स में एम्बेडेड पूरी तरह से अलग तर्क का उपयोग करता है, और यह प्रोजेक्ट-स्तरीय नियम स्थान या नियमसेट फ़ाइलों को खाते में नहीं लेता है। (यह CodeAnalysis.dll विधानसभा में Microsoft.VisualStudio.CodeAnalysis.ManagedRuleProvider वर्ग के माध्यम से किया जाना है, अगर आप रक्तमय विवरण के बारे में उत्सुक हैं लगता है।)

तो ... आप मूल रूप से दो विकल्प हैं अगर आप नियम नामों देखना चाहते हैं:

  1. अपनी नियम असेंबली <VS install directory>\Team Tools\Static Analysis Tools\FxCop\Rules फ़ोल्डर में रखें ताकि इसे विजुअल स्टूडियो द्वारा उठाया जा सके।

  2. एक HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePath रजिस्ट्री नोड अपने नियमों और बिल्ट-इन नियमों दोनों उनके नाम करने के लिए अनुमति देने के लिए निम्नलिखित की तरह एक मूल्य के साथ (बजाय मौजूदा CodeAnalysis उपयोग करने का एक स्थान के साथ Code Analysis नामक एक नया कुंजी बनाने,,) जोड़ें दिखाया गया है: %FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder

+0

मेरे मामले में, मैं '.ruleset' फ़ाइल के' RuleHintPaths' टैग का उपयोग किया मेरी DLL करने के लिए पथ देने के लिए, लेकिन जैसा कि आप कहते हैं कि वी.एस. के प्लगइन इसे अनदेखा करने लगता है। उत्तर के लिए धन्यवाद, भले ही यह वह नहीं है जिसे मैं देखना चाहता हूं :)। –

+0

फ़ाइलों को < \ टीम टूल्स \ स्टेटिक विश्लेषण उपकरण \ FxCop \ Rules' पर कॉपी करना, लेकिन यह उप-शीर्ष है क्योंकि हम अक्सर नियम जोड़ते हैं या tweak करते हैं। रजिस्ट्री कुंजी मेरे सिस्टम पर अनुपस्थित थी, इसलिए मैंने इसे बनाने की कोशिश की, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। मेरे पास विंडोज 7 64-बिट सिस्टम है, क्या कुंजी कहीं और स्थित हो सकती है? धन्यवाद! –

+0

क्या आपने रजिस्ट्री कुंजी जोड़ने के बाद विजुअल स्टूडियो को पुनरारंभ किया था? साथ ही, क्या आपने पूर्व-मौजूदा 'HKEY_CURRENT_USER \ Software \ Microsoft \ VisualStudio \ 11.0 \ CodeAnalysis' कुंजी के तहत FxCopRulePath मान जोड़ने का प्रयास किया है, या आपने शब्दों के बीच एक स्थान के साथ एक नया' कोड विश्लेषण 'कुंजी बनाई है? (उत्तरार्द्ध आवश्यक है।) –

संबंधित मुद्दे