将Microsoft.Bcl.Async与代码分析一起使用会导致错误



我试图使用Microsoft.Bcl.Async和代码分析,但当我运行代码分析时,我会遇到一个或多个错误。

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

这对我来说很容易复制:

  1. 创建一个新的默认控制台应用程序,以.Net 4为目标
  2. 右键单击References,然后选择Manage NuGet Packages...
  3. 单击Online,然后在Search Online框中键入async
  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.0.12.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a]System.Threading.Tasks.TaskEx::Delay.[Errors and Warnings](全局)

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

CA0001运行代码分析时出错CA0001:读取模块"AsyncForNet4"时遇到以下错误:无法解析成员引用:[Microsoft.Threading.Tasks,Version=1.0.12.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a]System.Threading.Tasks.TaskEx::Delay.[Errors and Warnings](全局)

两个问题:

  1. 其他人能重现这个问题吗
  2. 有人能解决这个问题吗

正如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及更高版本

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

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

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

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

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

  • 禁用代码分析
  • 重写代码以不使用TaskEx.Delay()

相关内容

  • 没有找到相关文章

最新更新