在代码分析中使用Microsoft.Bcl.Async会导致错误

时间:2013-06-25 13:10:45

标签: c# code-analysis fxcop base-class-library

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

我正在使用Visual Studio 2012和Update 2.

这对我来说很容易重现:

  1. 创建一个新的默认控制台应用,其目标是.Net 4
  2. 右键点击References,然后选择Manage NuGet Packages...
  3. 点击Online,然后在async框中输入Search Online
  4. 您应该看到Async for .Net Framework 4 ...。点击Install并接受所有问题。
  5. Main()添加一行说明:TaskEx.Delay(1000);using System.Threading.Tasks;
  6. 转到项目属性,代码分析部分,然后勾选Enable Code Analysis on Build
  7. 编译程序。
  8. 我收到两个代码分析错误:

      

    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. 有人有解决方案吗?

3 个答案:

答案 0 :(得分:48)

如Nicole所述,这是因为Code Analysis / FxCop强制执行包括版本在内的强名称。这种行为对.NET Framework有意义,直到开始考虑绑定重定向(或其他平台,如Store,Phone和amp; Silverlight,它们总是允许更高版本的程序集与早期版本匹配) ,FxCop不尊重。

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

通过命令行:

FxCopCmd.exe /assemblycomparemode:StrongNameIgnoringVersion ...

通过Visual Studio:

  1. 右键单击解决方案资源管理器中的项目,然后选择 卸载
  2. 右键单击解决方案资源管理器中的项目,然后选择修改
  3. 在第一个<PropertyGroup>元素中,添加以下内容:<CodeAnalysisAdditionalOptions> /assemblycomparemode:StrongNameIgnoringVersion</CodeAnalysisAdditionalOptions>
  4. 右键单击解决方案资源管理器中的项目,选择重新加载,在系统提示时保存更改。
  5. 这只适用于Visual Studio 2012及更高版本。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

  

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

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

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

  • 禁用代码分析
  • 重写您的代码,不要使用TaskEx.Delay()