静态CA使解决方案构建变得更慢。在我的情况下>比没有CA慢2倍。我们可以禁用它,但这是失去力量的坏决定。 所以,我们能做些什么?
首先让我们看看CA是如何运作的。
您构建解决方案。在每个项目构建之后,msbuild编译目标fxcopcmd.exe被调用,其中包含应该分析的程序集的路径。 fxcopcmd。生成由VS(或可能是输出流)使用的CA xml日志。 fxcopcmd.exe加载程序集(快速)并同步分析它,因此只加载一个CPU而3个(在我的情况下)什么都不做。只有在CA完成后,才会构建项目依赖关系链中的下一个项目。
因此,CA中的弱点是我们可以改进它 - 强制它并行工作以使用所有CPU。
我看到了这样的解决方案
要制作将从MSBUILD获取参数的假fxcopcmd.exe,请记住它并立即向msbuild报告一切正常并且没有错误(通过CA xml.log或成功文件,或者可能是流...)。所以MSBUILD将构建下一个项目,那时我们将使用保存的参数调用真正的fxcopcmd.exe ...如果MSBUILD将在下一个项目中调用fxcopcmd.exe - 我们将再次调用fxcopcmd.exe ...所以会有很少有加载所有CPU的进程。真正的fxcopcmd.exe完成后我们可以调用我们的MSBUILD目标,它将从microsoft.common.targtets只调用CA目标而没有编译,我们的假fxcopcmd.exe会立即报告结果(CA在那时完成,我们有日志)到MSBUILD-VS。
你怎么看?这会加速CA吗? 为什么Microsoft没有在CA中创建这样的人员并且只使用一个CPU?答案 0 :(得分:4)
我曾经问过similar question on Connect and got a reply directly from the team。在2012年的ALM峰会上,我讨论了这个主题,并且有很多原因(没有特别的顺序)
正如您在this MSDN forum post中看到的那样,Fxcop本身已经使用多个线程(至少在2010年附带的规则中),并发性问题已导致我们关闭Fxcop的并发性在某些情况下。如果您希望fxcop使用更多(或更少)的线程,您可以编辑fxcopcmd.exe.config
文件:
<FxCopEngineSettings Version="1.32">
<Engines>
<Engine Name="Introspection" Enabled="True">
<!-- Change this number to use more (or fewer) threads -->
<Threading Count="1" />
<EnableFlowAnalysis>True</EnableFlowAnalysis>
</Engine>
</Engines>
</FxCopEngineSettings>
虽然论坛帖子提到了Visual Studio 2008,但我已经应用它来解决2010年的问题。
使FxCop更高效的一种最简单的方法是在编译完所有项目后调用它一次。这将导致它只加载所有符号和引用的程序集一次,并允许引擎最大限度地利用并行性。当你有一个混合多个目标平台和cpu的解决方案,或者你想为不同的项目使用不同的.rules文件时,这也存在一些问题。
或者您可以做同样的事情,即为本地解决方案配置FxCop,但不要将其设置为在每个构建上运行。然后在Team Foundation Server Team Build(或您可能使用的任何其他构建服务器)中,覆盖FxCop的配置以运行“Always”。这样,在构建本地解决方案时,您不会对性能产生影响。它仍然允许您在本地运行代码分析(来自Analyze菜单项),自动构建可以防止您检查代码中的问题。