0

我在使用 fxcopcmd.exe 时遇到了一个非常奇怪的行为。如果我启动 fxcopcmd.exe,只指定一个程序集(Assembly X),则没有违规。但是如果我指定解决方案的所有程序集,它会在(Assembly X)中引发很多违规行为。有什么我错过的吗?请注意,在 Visual Studio 中使用代码分析时,即使我对所有程序集运行代码分析,也没有违规行为。

更多细节:

1- 我们在 Visual Studio 2013 中使用了一个包含六个大型 C# 项目的解决方案。

2- 我们使用来自 VisualStudio 2013(版本 12.0.21005.1)安装的 fxcopcmd.exe。

3- 未检测到任何违规的命令行命令示例:

tools\FxCopCmd\FxCopCmd.exe /file:build\bin\Assembly1.dll /out:results.txt /ruleset:=Tools\FxCopRuleSet\CompagnyRules.ruleset /ignoregeneratedcode

4- 检测违规的命令行命令示例:

tools\FxCopCmd\FxCopCmd.exe /file:build\bin\Assembly1.dll /file:build\bin\Assembly2.dll  /file:build\bin\Assembly3.dll /file:build\bin\Assembly4.dll /out:results.txt /ruleset:=Tools\FxCopRuleSet\CompagnyRules.ruleset /ignoregeneratedcode

请注意,在 Assembly1.dll 中检测到 100 多个违规。

导致违规的规则是: AvoidUninstantiatedInternalClasses, AvoidUncalledPrivateCode, AvoidUnusedPrivateFields, TypeNamesShouldNotMatchNamespaces


所以这与不同程序集之间的关系无关。我发现在 TeamCity 中正确自动化它的唯一解决方案是使用一个 nant 脚本,该脚本在不同的程序集上一一调用 fxcopcmd.exe 并将结果输出到不同的文件中。

欢迎任何想法!

谢谢。

4

1 回答 1

1

听起来Assembly1.dll可能有InternalsVisibleToAttribute实例从示例 4 命令行中列出的其他程序集的某个子集中生成朋友程序集。

当 FxCop 为具有未包含在运行中的朋友程序集的程序集运行时,这些规则无法判断在朋友程序集中是否可能存在调用目标程序集中代码的代码被调用,它给你带来了怀疑的好处(即:不标记可能是误报的违规行为)。但是,当您使用一组完整的朋友程序集运行时,规则可以做出该决定,并且您将看到标记为非公共代码的违规行为,这些代码不是从程序集本身或其朋友程序集中调用的。

顺便说一句,您不会在 Visual Studio 中看到违规行为,因为它为每个项目单独执行 FxCop。

于 2014-10-06T17:58:11.333 回答