我正在使用FxCopCmd工具进行静态代码分析。由于我们已经拥有庞大的代码库,因此我们使用FxCop附带的 baseline.exe 工具确定了现有问题。
我观察到,如果我在C#类中添加一个新方法,那么GlobalSuppression.cs文件中的一些抑制消息就会停止工作,我会触及我无法触及的代码的问题。
示例:
namespace ConsoleApplication1
{
class Program
{
public async Task<string> method1()
{
string a = "";
a.Equals("abc", StringComparison.InvariantCultureIgnoreCase);
return a;
}
static void Main(string[] args)
{
}
}
}
这会引发以下错误:
CA1031:Microsoft.Design:修改&#39; Program.d__0.MoveNext()&#39; 除了“异常”之外,还有一个更具体的例外情况。或重新抛出 例外
压制&#39; CA1309 UseOrdinalStringComparison&#39;问题,我在GlobalSuppression.cs文件中添加了以下抑制消息
[module:SuppressMessage(&#34; Microsoft.Globalization&#34;,&#34; CA1309:UseOrdinalStringComparison&#34;,Scope =&#34; member&#34;, 目标=&#34; ConsoleApplication1.Program.d__0.MoveNext()&#34 ;, 的MessageId =&#34; System.String.Equals(System.String,System.StringComparison)&#34 ;, 理由=&#34;&#34)]
但是如果我在类中再添加一个方法,那么这个抑制消息就会停止工作。这是因为method1是异步的,因此在编译的代码中创建了一个新类(refer this)(在第一种情况下为<method1>d__0
)。但是当我在method1之前添加另一个方法时,在编译代码中创建的新类名为<method1>d__1
。因此,不应用抑制消息,并且FxCop再次开始在代码中显示错误。
有没有办法永久抑制异步方法的FxCop错误?
答案 0 :(得分:2)
所以即使在设定赏金之后,这个问题也没有得到答复。但是,我找到了解决方法(如果不是解决方案)。
提到的问题是由于编译器生成的异步方法代码。由于FxCopCmd在dll上运行,因为编译器生成的代码被更改,现有的抑制消息变得无用。但是,Visual Studio不仅仅使用FxCopCmd来运行代码分析。它运行代码分析,智能地忽略异步方法。 (根据我的调查,它不会对异步方法进行任何类型的代码分析。这必然是由于问题所在。)
要在CI版本中获得与Visual Studio相同的行为,我们可以使用fxcoptask.dll在代码上运行FxCop分析。请参阅this answer以了解如何在构建中集成FxCop。这将解决问题中提到的问题。此外,它提供了许多自定义选项。