我想运行一个命令来查看 FxCop 将支持的所有规则(基于其规则目录中的 DLL)。
这可能吗?
可以在 FxCop UI 的“规则”选项卡中查看规则列表(例如: http: //www.binarycoder.net/fxcop/html/screenshot.png)。
如果您想要一个文本版本并且没有允许您从 UI 中提取它的屏幕剪辑工具,那么通过一些反思来提取规则列表非常简单。您可以调用 FxCop 对象模型中的内部类型和方法来执行此操作,也可以Microsoft.FxCop.Sdk.IRule
在规则程序集中查找实现接口的具体类。例如:
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);
}
}
}