StyleCop和FxCop规则相互排斥

时间:2009-09-03 07:35:08

标签: c# .net coding-style fxcop stylecop

我正在使用StyleCop和FxCop工具来改进我的代码但是我来到了一个有两个规则的地方,一个在StyleCop中,另一个在FxCop中相互排斥。如果我修复我的代码以匹配StyleCop中的规则,则FxCop验证失败,反之亦然。

第一条规则是StyleCop的SA1200,它规定所有使用指令必须放在命名空间内。

  

所有using指令必须放在命名空间内。

所以我做了类似的事情

namespace MyNamespace
{
    using System;

    ...
}

StyleCop没问题,没有更多警告。现在我运行FxCop验证,它告诉我CA1014被违反了:

  

使用CLSCompliant标记'MyApp.dll'(true),因为它公开了外部可见类型。

要解决这个问题,我应该这样做:

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

但现在我无法构建我的项目,因为ClsCompliant属性未被识别(因为它来自System命名空间,我包含在MyNamespace内部。因此,如果我在using System;声明之外移动MyNamespace指令。这将使我的代码编译,但它将再次破坏StyleCop的规则。

除了禁用StyleCop或FxCop中的一个规则外,有没有办法解决这个问题?如果不可能我禁用哪个规则?哪个不太重要?

2 个答案:

答案 0 :(得分:15)

使用完整属性名称:

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

BTW:如果你想把你的整个程序集标记为CLSCompliant,请输入

[assembly: System.CLSCompliant(true)]

在Properties / AssemblyInfo.cs文件中

答案 1 :(得分:3)

我的建议是关闭“所有使用指令必须放在命名空间内”。 StyleCop中的规则。坚持它是不切实际的,特别是因为大多数代码生成器(甚至VS自己的代码生成器)都不遵循这种做法。