20

我正在尝试使用Microsoft.Bcl.Async和代码分析,但是当我运行代码分析时,我得到一个或多个错误。

我正在使用带有更新 2 的 Visual Studio 2012。

这对我来说很容易重现:

  1. 创建一个新的默认控制台应用程序,以.Net 4.
  2. 右键单击References然后选择Manage NuGet Packages...
  3. 单击OnlineasyncSearch Online框中键入。
  4. 你应该看到Async for .Net Framework 4 ...。单击Install并接受所有问题。
  5. 添加到Main()显示以下内容的行:TaskEx.Delay(1000);using System.Threading.Tasks;
  6. 转到项目属性,代码分析部分并打勾Enable Code Analysis on Build
  7. 编译程序。

我收到两个代码分析错误:

CA0052 错误运行代码分析 CA0052:没有选择目标。[错误和警告](全球)

CA0055 错误运行代码分析 CA0055:无法加载 ConsoleApplication2.exe。读取模块“ConsoleApplication2”时遇到以下错误:无法解析成员引用:[Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]System.Threading.Tasks.TaskEx::Delay。[错误和警告](全球)

对于其他测试程序,我得到不同的代码分析错误。我试过的一个基本的 Windows 窗体应用程序给了我:

CA0001 错误运行代码分析 CA0001:读取模块“AsyncForNet4”时遇到以下错误:无法解析成员引用:[Microsoft.Threading.Tasks,Version=1.0.12.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a]System.Threading。 Tasks.TaskEx::延迟。[错误和警告](全球)

两个问题:

  1. 其他人可以重现这个问题吗?
  2. 有没有人有解决方案?
4

3 回答 3

48

正如 Nicole 所提到的,这是因为代码分析/FxCop 强制要求包括版本在内的强名称完全匹配。这种行为对于 .NET Framework 是有意义的,直到您开始考虑绑定重定向(或其他平台,例如 Store、Phone 和 Silverlight,它们总是允许程序集的更高版本与早期版本匹配),而 FxCop 不尊重这些。

我在 FxCop 中编写了这个原始行为,它针对正确性与现实世界进行了过度优化。当时,除了通过 App.Config 之外,我们没有选择退出。然而,幸运的是,在我离开团队后,团队中的一些聪明人通过命令行和 Visual Studio 都添加了一个。

通过命令行:

FxCopCmd.exe /assemblycomparemode:StrongNameIgnoringVersion ...

通过 Visual Studio:

  1. 右键单击解决方案资源管理器中的项目并选择 卸载
  2. 在解决方案资源管理器中右键单击项目并选择编辑
  3. 在第一个<PropertyGroup>元素中,添加以下内容: <CodeAnalysisAdditionalOptions> /assemblycomparemode:StrongNameIgnoringVersion</CodeAnalysisAdditionalOptions>
  4. 右键单击解决方案资源管理器中的项目,在出现提示时选择重新加载保存更改。

这仅适用于 Visual Studio 2012 及更高版本。

于 2013-07-29T22:37:08.633 回答
3

发生这种情况是因为 Bcl.Async 程序集中声明的依赖项版本与分析时可用的版本不匹配。最简单的解决方法是调整 FxCop AssemblyReferenceResolveMode,如http://davesbox.com/archive/2008/06/14/reference-resolutions-changes-in-code-analysis-and-fxcop-part-2.aspx所述。

于 2013-06-25T14:53:55.903 回答
1

遇到同样的问题,正在寻找解决方案。我发现的唯一提及是在 bcl 博客文章的评论中 - Microsoft.Bcl.Async 现在稳定(评论的第 3 页),其中 Immo Landwerth 对遇到同样问题的人的回应是;

我们正在调查它。乍一看,这似乎是 VS 静态代码分析功能 (FxCop) 中的统一问题。我们已经联系了它的所有者。不幸的是,我认为除了禁用这些项目的代码分析之外没有其他解决方法:-(

回复日期为 2013 年 4 月 26 日,此后是否有任何进展。

所以现在我想解决方法是:

  • 禁用代码分析
  • 重写你的代码不使用TaskEx.Delay()
于 2013-06-25T14:23:48.407 回答