1

我目前正在编写一个在大型代码库上解析 FxCop 日志文件的工具。我的目标是提供有关最常见警告的图形信息,按名称空间(应用程序的子系统)排序。

请参见示例图。

然后可以使用它来开始讨论我们关心哪些 FxCop 规则以及应该采取哪些行动来删除它们。

日志文件包含两种类型的条目。一种可以从行本身推导出命名空间,另一种则不能。请参阅以下示例:

[Any CPU/Release] LoggerWrapper.cs(647,28): warning CS1574: XML comment on 'CompanyName.Utilities.Logging.Internal.LoggerWrapper.WarningException(System.Exception, short, long)' has cref attribute 'CompanyName.Common.Services.Logging.LoggerWrapper.Warning(string)' that could not be resolved

您可以看到此警告属于命名空间 CompanyName.Common。

[Any CPU/Release] d:\Bld\CompanyName\2010_MAIN_F\Sources\CompanyName\Utilities\Logging\Store\EventViewer\NativeHelper.cs(254,0): warning : CA1307 : Microsoft.Globalization : 'NativeHelper.GetSid(string, out IntPtr)' makes a call to 'string.IndexOf(string)' that does not explicitly provide a StringComparison. This should be replaced with a call to 'string.IndexOf(string, StringComparison)'.
[Any CPU/Release] (-1,0): warning : CA1823 : Microsoft.Performance : It appears that field 'NativeHelper.IIsApplicationPoolSettingProperty' is never used or is only ever assigned to. Use this field or remove it.
[Any CPU/Release] (-1,0): warning : CA1823 : Microsoft.Performance : It appears that field 'NativeHelper.IIsSettingProperty' is never used or is only ever assigned to. Use this field or remove it.

在此条目中,您无法将最后两个警告解析为命名空间。您必须回溯到第一行才能推断出它与 CompanyName.Utilities 命名空间有关。

你会如何处理这种情况?我不是在寻找 100% 万无一失的标识,但我希望能够将大多数警告解析到相应的命名空间。

到目前为止我的策略: 我正在考虑使用两遍解析器。首先,我将解析可以从同一行中推断出命名空间信息的行。在第二遍中,我将搜索没有命名空间信息的行,并将从该位置回溯到有命名空间信息的第一行。

我没有能力让 FxCop 生成 XML。Team Foundation Server 确实为每个程序集以 XML 格式创建单独的 FxCop 文件,但包含整个日志文件的文件采用上述格式。

有更好的想法或建议吗?

到目前为止很好的建议!有关日志文件的一些额外信息。此日志文件由 Team Foundation Server 团队构建生成。我不知道是否可以从中创建 XML 版本。

4

3 回答 3

1

运行 FxCop 以便获得 XML 报告,将其与 XSL 配对,然后获得图形表示。我认为有一些 XSL 表可供选择,但我认为这个可以解决问题

通常,我让CruiseControl.NET使用相关项目的 msbuild 文件为我执行此操作。

于 2009-07-15T08:43:11.637 回答
0

您可以获得 XML 格式的输出,它通过嵌套报告来解决这个问题。

再加上一些 XSLT,可以为您提供格式良好的 HTML 页面——理想情况下应该看起来像

Collated style report for solution: 0 messages

Generated: 13/07/2009 11:23:49
于 2009-07-15T08:40:06.447 回答
0

很好的答案,但我只能访问 ASCII 格式的普通日志文件,所以 XSLT 在这里不起作用。

我通过编写自己的解析器来解决它,该解析器试图从每一行中推断出一个命名空间。如果带有警告的行不包含命名空间,它将采用最后找到的命名空间。

工作出色。

于 2009-07-20T12:11:46.027 回答