FxCop:异步方法

时间:2016-11-09 17:01:19

标签: c# .net async-await fxcop fxcopcmd

我正在使用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错误?

1 个答案:

答案 0 :(得分:2)

所以即使在设定赏金之后,这个问题也没有得到答复。但是,我找到了解决方法(如果不是解决方案)。

提到的问题是由于编译器生成的异步方法代码。由于FxCopCmd在dll上运行,因为编译器生成的代码被更改,现有的抑制消息变得无用。但是,Visual Studio不仅仅使用FxCopCmd来运行代码分析。它运行代码分析,智能地忽略异步方法。 (根据我的调查,它不会对异步方法进行任何类型的代码分析。这必然是由于问题所在。)

要在CI版本中获得与Visual Studio相同的行为,我们可以使用fxcoptask.dll在代码上运行FxCop分析。请参阅this answer以了解如何在构建中集成FxCop。这将解决问题中提到的问题。此外,它提供了许多自定义选项。