Microsoft已更新.net 4.0的async / await目标,现在建议使用Microsoft.Bcl.Async上提供的nuget库。
在发行说明中,它指出.net 4需要KB 2468871。
答案 0 :(得分:2)
引自http://support.microsoft.com/kb/2468871/en-us
功能5对支持可移植库的更改。这些变化 包括API更新和活页夹修改。此更新启用了 CLR成功绑定到可移植库,以便单个DLL 可以在.NET Framework 4上,在Silverlight上,在Xbox上运行,也可以在 Windows Phone。此更新将公共Silverlight API添加到.NET 框架4在同一位置。 API签名将保留 整个平台一致。所有修改都是100% 兼容并且不会破坏任何现有代码。
事实证明,如果没有安装这个kb,Microsoft.Bcl会崩溃(它会尝试绑定到系统上没有的silverlight System.Core
库)
答案 1 :(得分:2)
在.net 4.0中使用async / await而不安装KB2468871的唯一安全方法是在vs SP1 SP1中安装异步CTP v3,nuget microsoft bcl async并实现自己的AsyncTaskMethodBuilder和AsyncVoidMethodBuilder。 (并删除async ctp dll引用)
这是唯一的方法.net4,vs 2010中的任何非异步CTP异步实现,没有安装vs 2012,net 4.5或KB2468871都可以。
在.net4上任何其他现成的async实现都使用了在编译过程中实现和桥接异步代码的新方法,这就是你需要安装异步CTP的原因,它是.net4唯一的异步实现,修改csc编译器以支持它。
Microsoft已经改变了编译器在c#5和.net 4.5中使用的类型来生成异步代码,基本上它们可以轻松地为.net4完成,但是他们选择强制任何人安装vs 2012和.net 4.5,这对于需要支持xp用户的公司来说是不可接受的,因为你无法查看和修复.net 4.5中修复的任何.net 4错误。
Microsoft.Bcl.Async,AsyncTargetingPack,AsyncBridge如果没有安装.net 4.5或KB2468871用于.net 4.0,它们都不会工作。
如果您自己实现AsyncTaskMethodBuilder和AsyncVoidMethodBuilder,它们将全部工作,您甚至可以从async ctp v3复制/粘贴它的实现,并进行微小的更改,它将起作用。
因此,如果您真的关心部署要求以及与支持xp用户相关的其他事情,我强烈建议我这样做。
答案 2 :(得分:0)
发行说明详情:
在定位以下任何平台(或更高版本)时:
• .NET Framework 4.0 (with KB2468871)
因此,这意味着您'目标'为4.0 w / KB2468871,因为KB2468871必须部署在目标计算机上才能支持该库。
没有详细说明Microsoft.Bcl.Async需要KB2468871的哪些部分。我建议您联系BCL团队,发布到博客,或联系Nuget包裹所有者了解更多详情。我不清楚知道KB需要哪些部分会产生什么影响......
答案 3 :(得分:0)
可以使用不带KB2468871的AsyncBridge便携式设备来获得异步/等待功能。 https://www.nuget.org/packages/AsyncBridge.Portable/