FxCop:异步方法的抑制消息

FxCop: Suppression message for async method

我正在使用 FxCopCmd 工具进行静态代码分析。由于我们已经拥有庞大的代码库,因此我们使用 FxCop 附带的 baseline.exe 工具对现有问题进行了基线处理。

我观察到,如果我向我的 C# class 添加一个新方法,那么 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 : Modify 'Program.d__0.MoveNext()' to catch a more specific exception than 'Exception' or rethrow the exception

为了抑制 'CA1309 UseOrdinalStringComparison' 问题,我在 GlobalSuppression.cs 文件中添加了以下抑制消息

[module: SuppressMessage("Microsoft.Globalization", "CA1309:UseOrdinalStringComparison", Scope="member", Target="ConsoleApplication1.Program.d__0.MoveNext()", MessageId="System.String.Equals(System.String,System.StringComparison)", Justification="")]

但如果我在 class 中再添加一种方法,则此抑制消息将停止工作。这是因为 method1 是异步的,因此在编译代码中创建了一个新的 class (refer this)(在第一种情况下是 <method1>d__0)。但是当我在 method1 之前添加另一个方法时,编译代码中创建的新 class 被命名为 <method1>d__1。因此,未应用抑制消息,FxCop 再次开始显示代码中的错误。

有没有办法永久抑制异步方法的 FxCop 错误?

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

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

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