FxCopCmd.exe仅在同时在多个程序集上执行时显示违规

时间:2014-10-02 13:20:14

标签: visual-studio-2013 code-analysis fxcop fxcopcmd

我在fxcopcmd.exe中遇到了一个非常奇怪的行为。如果我启动fxcopcmd.exe只指定一个程序集(程序集X),则没有违规。但是如果我指定解决方案的所有程序集,它会在(程序集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多个违规。

导致违规的规则是: AvoidUninstantiatedInternalClassesAvoidUncalledPrivateCodeAvoidUnusedPrivateFieldsTypeNamesShouldNotMatchNamespaces


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

欢迎任何想法!

感谢。

1 个答案:

答案 0 :(得分:1)

听起来Assembly1.dll可能有InternalsVisibleToAttribute个实例,这些实例会使示例4命令行中列出的其他程序集的某些子集中的好友程序集。

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

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