如何修复 FxCop 错误代码 512?

Posted

技术标签:

【中文标题】如何修复 FxCop 错误代码 512?【英文标题】:How to fix FxCop error code 512? 【发布时间】:2011-10-31 03:08:29 【问题描述】:

在重构、移动一些程序集等时,我在 Visual Studio 中编译了一个解决方案并返回了一条错误消息:“FxCop 退出,错误代码为 512”。除了这个错误之外,构建似乎很好。

有人知道这实际上是什么意思吗?我可以从哪里开始寻找解决方法?将 FailOnError 设置为 false 不是我想走的路。

【问题讨论】:

愚蠢的问题,但与 ChrisWue 的回答有关:您是否尝试过重新启动 VS?也许它与哪些程序集被加载/哪些程序集不能被卸载有关。不确定 FxCop 是否将程序集加载到 VS 的应用程序域中,但我见过其他插件/应用程序这样做。 根本不是一个愚蠢的问题(只是一个经常需要重新启动的愚蠢 IDE,哈哈)。是的,我试过了。 您找到解决方案了吗?我遇到了同样的问题 Magritte,我已经成功使用了 JohnDRoach 的答案。 【参考方案1】:

其他答案都在正确的轨道上,但错过了一小部分。

抑制是一种选择,但您可能会隐藏有关重要 dll 的错误,这不是一件好事。 随机依赖目录容易出错。 Xml 报告是查看的地方,但 FxCop MSBuild 任务没有显示它把它们放在哪里:(

为了从命令行运行 FxCop,我必须执行以下操作:

FxCopCmd.exe /f:<Assembly.dll> /o:<OutputFileName> /verbose

FxCopCmd 是 MSBuild Task 使用的。如果缺少程序集,它将返回错误代码 512,即使运行该程序集不需要该程序集。请参阅以下 FxCop 消息:

找不到间接引用的程序集“Newtonsoft.Json, Version=4.0.2.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”。 分析不需要此程序集,但分析结果可能不完整。此程序集由:Removed.dll 引用。

添加对该dll的引用,然后错误代码消失。

【讨论】:

【参考方案2】:

我找到了解决方案。这是因为我引用了一个更高版本的程序集,而 FxCop 抱怨它并警告 CA0060 进一步向下。解决方法是编辑 FxCopCmd.exe.config 文件并更改

<add key="AssemblyReferenceResolveMode" value="StrongName" />

<add key="AssemblyReferenceResolveMode" value="StrongNameIgnoringVersion" />

【讨论】:

【参考方案3】:

根据MSDN,这意味着它未能引用某些程序集。 This guy 建议用(我引用他的博客)覆盖它:

The following can be placed directly into the Post-build event field in your project's properties.
<YOUR FXCOP COMMAND>
IF 512 == %ERRORLEVEL% (
    echo postbuildevent:fxcop warning FXCOP:FxCopCode analysis was unable to complete.
    SET ERRORLEVEL = 0
) 

【讨论】:

是的,我也发现了那个博客,但不确定在不知道是什么原因的情况下有效抑制错误是否是个好主意。毕竟,FxCop 旨在捕捉不好的东西,但仍然可以编译。 @Nick W。好吧,如果它是一个程序集引用错误,那么打开 Fusion 日志记录可能有助于找出它找不到哪个程序集。 感谢您的提示,但没有骰子。我尝试打开完整的融合日志记录,然后重新运行编译。我在 FxCopCmd.exe 上得到了一堆绑定,但都报告成功完成。【参考方案4】:

如果声纳运行器未找到依赖程序集位置,则会出现 FxCop 错误代码 512: 要解决此错误,您必须在 Sonar-Runner 中设置 assemblyDependencyDirectories 属性。 this 的值应该是以逗号分隔的路径模式列表,以定位可以找到依赖程序集的目录。

这些路径可以是绝对路径或相对路径,起点是 csproj 文件所在的文件夹。此外,特殊键 $(SolutionDir) 可用于构建相对于解决方案根文件夹的路径(即 sln 文件所在的位置)。

例如:$(SolutionDir)/**/libs(而不是$(SolutionDir)/**/libs/*.dll

例如:sonar.fxcop.assemblyDependencyDirectories=$(SolutionDir)/**/libs,$(SolutionDir)/**/Debug

关于更多声纳运行器错误click here的详细解决方案和解决方案。

【讨论】:

【参考方案5】:

寻找额外信息的第一个地方是 XML 报告文件——它通常在末尾有一些有用的信息。

如果做不到这一点,我在这种情况下使用的另一种技术是在 FxCop GUI 中进行相同的查询;当它无法解析程序集引用时会弹出一个对话框,要求您指向相关程序集。知道它是哪个程序集可以更容易地添加额外的目录路径。

【讨论】:

【参考方案6】:

不确定您是否仍在寻找解决方案,但通常对我有用的是添加 fxcop cmdline-option /d:dir-of-random-assemblies 这实际上告诉 fxcop 在该附加目录中查找组件。在我看来,添加对不需要它的项目的引用是一个坏主意。 这也是一种解决问题的非hacky方式。

http://msdn.microsoft.com/en-US/library/bb429449(v=vs.80).aspx

【讨论】:

以上是关于如何修复 FxCop 错误代码 512?的主要内容,如果未能解决你的问题,请参考以下文章

513 错误代码(退出代码)FxCop 使用 C#

FxCop VS2013 有人知道警告标识符是啥吗?

如何防止 FxCop 分析自动生成的代码?

您如何从遗留代码上的 FxCop 开始?

通过生成参数验证来修复 FxCop CA1062

使用 NCrunch、FxCop 分析器和“错误警告”:如何在 NCrunch 中配置警告严重性?