Правила StyleCop и FxCop исключают друг друга

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

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

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

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

namespace MyNamespace
{
    using System;

    ...
}

Для StyleCop это было нормально, никаких предупреждений. Теперь я запускаю проверку FxCop, и она сообщает мне, что CA1014 нарушен:

Пометьте MyApp.dll параметром CLSCompliant (true), поскольку он предоставляет видимые извне типы.

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

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

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

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


person RaYell    schedule 03.09.2009    source источник


Ответы (2)


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

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

Кстати: если вы хотите пометить всю свою сборку как CLSCompliant, поставьте

[assembly: System.CLSCompliant(true)]

в файле Properties / AssemblyInfo.cs

person maciejkow    schedule 03.09.2009
comment
Я думаю, что сборка должна быть помечена как CLSCompliant, как указал Maciejkow, вместо того, чтобы отмечать совместимость пространства имен. - person David Silva Smith; 14.03.2010

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

person Igor Brejc    schedule 12.09.2009
comment
Я думаю, что лучше настроить StyleCop так, чтобы он просто игнорировал сгенерированные файлы. - person RaYell; 12.09.2009
comment
Да, если они отмечены соответствующим атрибутом. К сожалению, некоторые генераторы кода не помечают сгенерированный код. - person Igor Brejc; 13.09.2009