2009-09-03 2 views
5

Я использую инструменты StyleCop и FxCop для улучшения моего кода, но я пришел к месту, где есть два правила: один в StyleCop и один в FxCop, которые исключают друг друга. Если я исправлю свой код для соответствия правилу с StyleCop, то проверка FxCop завершится неудачно и наоборот.Правила StyleCop и FxCop исключают друг друга

Первое правило - SA1200 от StyleCop, в котором говорится, что все используемые директивы должны быть помещены внутри пространства имен.

Все используемые директивы должны быть размещены внутри пространства имен.

Так что я сделал что-то вроде этого

namespace MyNamespace 
{ 
    using System; 

    ... 
} 

Это было нормально для StyleCop, не больше предупреждений. Теперь я бегу проверки FxCop, и он говорит мне, что CA1014 нарушается:

Марка «MyApp.dll» с CLSCompliant (правда), так как он предоставляет внешне видимые типы.

Чтобы решить эту проблему, я должен сделать что-то вроде этого:

[ClsCompliant(true)] 
namespace MyNamespace 
{ 
    ... 
} 

, но теперь я не могу построить мой проект, потому что ClsCompliant атрибут не распознается (потому что это из System имен, которые я включаю внутри MyNamespace) , Поэтому, если я переведу директиву using System; за пределами объявления MyNamespace. Это заставит мой код скомпилировать, но снова он нарушит правило из StyleCop.

Есть ли способ решить эту проблему, кроме как отключить одно из правил в StyleCop или FxCop? И если это невозможно, какие из правил я должен отключить? Что менее важно?

ответ

15

Используйте полное имя атрибута:

[System.CLSCompliant(true)] 
namespace MyNamespace 
{ 
    ... 
} 

КСТАТИ: если вы хотите, чтобы отметить всю сборку как CLSCompliant, положить

[assembly: System.CLSCompliant(true)] 

в свойствах/AssemblyInfo.cs файл

+4

Я думаю, что сборка должна быть маркирована CLSCompliant, как указано maciejkow, вместо того, чтобы маркировать совместимое пространство имен. –

3

Мое предложение заключается в отключении «Все используемые директивы должны быть помещены внутри пространства имен». правило в StyleCop. Нецелесообразно придерживаться этого, тем более, что большинство генераторов кода (даже VS собственных) не следуют этой практике.

+0

Я думаю, что лучше установить StyleCop просто игнорировать сгенерированные файлы. – RaYell

+2

Да, если они отмечены соответствующим атрибутом. К сожалению, некоторые из генераторов кода не отмечают сгенерированный код. –