在代码分析中使用Microsoft.Bcl.Async会导致错误
我正在尝试使用Microsoft.Bcl.Async
和代码分析,但是当我运行代码分析时,我得到一个或多个错误。
我正在使用Visual Studio 2012和Update 2。
这对我来说很容易重现:
- 创建一个针对
.Net 4
的新默认控制台应用程序。 - 右键单击
References
然后选择Manage NuGet Packages...
- 单击“
Online
然后在Search Online
框中键入async
。 - 您应该看到
Async for .Net Framework 4 ...
单击“Install
并接受所有问题。 - 添加到
Main()
一行说:TaskEx.Delay(1000);
和一个using System.Threading.Tasks;
- 转到项目属性,代码分析部分,然后勾选
Enable Code Analysis on Build
。 - 编译程序。
我收到两个代码分析错误:
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 ::延迟。 [错误和警告](全球)
两个问题:
- 其他人可以重现这个问题吗?
- 有人有解决方案吗?
正如Nicole所提到的,这是因为Code Analysis / FxCop强制执行包括版本在内的强名称。 这种行为对.NET Framework有意义, 直到您开始考虑绑定重定向(或其他平台,如Store,Phone和Silverlight,它们总是允许更高版本的程序集与早期版本匹配),这是FxCop不尊重的。
我在FxCop中编写了这个原始行为,而且它正在优化正确性与现实世界。 当时,我们除了通过App.Config之外没有选择退出。 然而,幸运的是,在我离开团队之后,团队中的一些聪明人通过命令行和Visual Studio中添加了一个。
通过命令行:
FxCopCmd.exe /assemblycomparemode:StrongNameIgnoringVersion ...
通过Visual Studio:
- 在解决方案资源管理器中右键单击项目,然后选择“ 卸载”
- 在解决方案资源管理器中右键单击项目,然后选择“ 编辑”
- 在第一个
元素中,添加以下内容:/assemblycomparemode:StrongNameIgnoringVersion - 在解决方案资源管理器中右键单击项目,选择“ 重新加载” ,在出现提示时保存更改。
这仅适用于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 是Now Stable (评论的第3页),其中Immo Landwerth对有同样问题的人的回应是;
我们正在研究它。 乍一看,这似乎是VS静态代码分析function(FxCop)中的统一问题。 我们已联系过它的所有者。 不幸的是,我不认为除了禁用这些项目的代码分析之外还有一个解决方法:-(
该回复的日期为2013年4月26日,此后是否有任何进展。
所以现在我想解决方法是:
- 禁用代码分析
- 重写您的代码不要使用
TaskEx.Delay()