查询FxCop支持的规则(使用命令行)

时间:2013-11-08 20:46:16

标签: fxcop fxcopcmd

我想运行一个命令来查看FxCop将支持的所有规则(基于其Rules规则中的DLL)。

这可能吗?

1 个答案:

答案 0 :(得分:1)

可以在FxCop UI的“规则”选项卡中查看规则列表(例如:http://www.binarycoder.net/fxcop/html/screenshot.png)。

如果你想要一个文本版本并且没有允许你从UI中提取它的屏幕剪辑工具,那么通过一些反思来提取规则列表是非常简单的。您可以在FxCop对象模型中调用内部类型和方法来执行此操作,也可以查找在规则程序集中实现Microsoft.FxCop.Sdk.IRule接口的具体类。 e.g:

internal static class Program
{
    private static void Main(string[] args)
    {
        Program.EnumerateFxCopRules(@"C:\Program Files (x86)\Microsoft Fxcop 10.0\Rules");
        Console.ReadLine();
    }

    private static void EnumerateFxCopRules(string ruleDirectoryPath)
    {
        foreach (var ruleAssembly in Program.GetAssemblies(ruleDirectoryPath))
        {
            Program.WriteRuleList(ruleAssembly);
        }
    }

    private static IEnumerable<Assembly> GetAssemblies(string directoryPath)
    {
        var result = new List<Assembly>();
        foreach (var filePath in Directory.GetFiles(directoryPath, "*.dll"))
        {
            try
            {
                result.Add(Assembly.LoadFrom(filePath));
            }
            catch (FileLoadException)
            {
                Console.WriteLine("FileLoadException attempting to load {0}.", filePath);
            }
            catch (BadImageFormatException)
            {
                Console.WriteLine("BadImageFormatException attempting to load {0}.", filePath);
            }
        }

        return result;
    }

    private static void WriteRuleList(Assembly ruleAssembly)
    {
        Console.WriteLine(ruleAssembly.Location);

        foreach (var ruleType in ruleAssembly.GetTypes().Where(t => (!t.IsAbstract) && typeof(IRule).IsAssignableFrom(t)))
        {
            Console.WriteLine("\t{0}", ruleType.FullName);
        }
    }
}