Visual Studio 2012 代码分析错误 CA0058

3

我目前正在处理一个包含多个项目的解决方案,在从VS12运行代码分析工具时,尝试运行它时遇到以下错误:

CA0058 Error Running Code Analysis CA0058:找不到引用的程序集“Microsoft.Practices.Unity,Version = 2.1.505.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”。此程序集是分析所必需的,并由以下文件引用:c:\MyProject\bin\Release\MyProject.exe, C:\MyProject\packages\Prism.UnityExtensions.4.1.0.0\lib\NET40\Microsoft.Practices.Prism.UnityExtensions.dll。[Errors and Warnings] (Global)

我还遇到了两个其他错误:

CA0052:未选择任何目标

CA0055 Error Running Code Analysis CA0055:C:\ MyProject \ bin \ Release \ IntraEUA Management Software 2.0.exe在读取模块“Microsoft.Practices.Prism.UnityExtensions”时遇到以下错误:无法解析程序集引用:Microsoft.Practices.Unity,Version = 2.1.505.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35。[Errors and Warnings] (Global)

但奇怪的是,在我的解决方案中,我没有使用UnityExtensions ersion 2.1.505.0,我正在使用4.1.0.0。而且更奇怪的是,在解决方案中的所有其他项目中,它都可以工作,使用完全相同版本的UnityExtensions,甚至在所有其他项目中的PublicKeyToken也是相同的。

我已尝试在整个解决方案中搜索字符串“2.1.505.0”,但没有发现任何内容。所以VS从哪里获取这些信息?

顺便说一句,我使用NuGet获得了UnityExtension。并尝试删除和重新安装UnityExtensions,但无效。我正在使用.NET 4.5。

有什么想法来摆脱这个可能是错误的错误?或者至少有一个忽略它的解决方法吗?


FxCopCmd.exe.configAssemblyReferenceResolveModeStrongName 更改为 StrongNameIgnoreVersion 可以解决症状,但肯定不能解决根本问题。 - coder0815
你使用的Prism和Unity软件包版本是什么? - Jean Hominal
Prism 是 4.1.0.0 版本,Unity 是 3.0.1304.1 版本。 - coder0815
3个回答

9

这个根本问题由两个事实共同造成:

  1. Prism.UnityExtensions 版本 4.1.0.0 引用了具有强名称的 Unity 版本为 2.1.505.0,但您却拥有一个新版本,是使用强名称签名的版本 3.0.0.0
  2. 在其默认操作模式下,FxCop 坚持认为程序集名称必须与引用匹配,包括确切的版本号,从而忽略程序集重定向(这是允许这些组件在运行时工作的唯一方法);

这意味着,这个混乱并不是您的错,只是因为尝试使用“意外”的库版本组合以及 FxCop 的程序集解析逻辑中的疏漏导致的结果。

解决这个问题的主要方法是将 FxCop 的 AssemblyReferenceResolveMode 设置为 StrongNameIgnoringVersion。 有多种方法可以实现这一点,一种是在每台计算机上进行设置,另一种是在每个项目中进行设置。

  • 一种方法是像您所做的那样,在 FxCopCmd.exe.config(从 VS12 调用)或 FxCop.exe.config(调用命令行 FxCop.exe)中将 AssemblyReferenceResolveMode 设置为 StrongNameIgnoringVersion
  • 另一种方法是在每个 .csproj 文件中的 PropertyGroup XML 元素内添加一行:
<PropertyGroup>
  <CodeAnalysisAdditionalOptions>/assemblyCompareMode:StrongNameIgnoringVersion</CodeAnalysisAdditionalOptions>
</PropertyGroup>

我建议对于任何打算与他人共享的项目,使用每个项目的设置。

非常感谢您详细的回答! - coder0815
1
第一条应该像第二条一样是StrongNameIgnoringVersion。 - Brett Bim

1
唯一的解决方法是将 FxCopCmd.exe.config 中的 AssemblyReferenceResolveModeStrongName 更改为 StrongNameIgnoreVersion。我想不出其他办法,所以只能这样生活了。

0

我最近也遇到了这个问题。问题是:引发错误的项目的调试构建配置针对 any CPU 平台。将其更改为值 x86 ,就像解决方案中的其他项目一样,可以解决问题。

这些设置可以在Visual Studio中找到: * 在解决方案资源管理器中右键单击解决方案以打开上下文菜单 * 选择属性,加载解决方案属性页面对话框 * 您要查找的设置在此处: Configuration Properties >> Configuration


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接