Microsoft 已更新 .net 4.0 的 async/await 目标,现在建议使用nuget上提供的Microsoft.Bcl.Async库。
在发行说明中,它指出需要带有KB 2468871的 .net 4。
- KB2468871 是构建要求还是部署要求?
- KB2468871 的哪些方面需要它?
Microsoft 已更新 .net 4.0 的 async/await 目标,现在建议使用nuget上提供的Microsoft.Bcl.Async库。
在发行说明中,它指出需要带有KB 2468871的 .net 4。
引用自http://support.microsoft.com/kb/2468871/en-us
功能 5 对支持可移植库的更改。这些更改包括 API 更新和活页夹修改。此更新使 CLR 能够成功绑定到可移植库,以便单个 DLL 可以在 .NET Framework 4、Silverlight、Xbox 或 Windows Phone 上运行。此更新将公共 Silverlight API 添加到同一位置的 .NET Framework 4。API 签名将在整个平台上保持一致。所有修改都是 100% 兼容的,不会破坏任何现有代码。
事实证明,如果没有安装这个 kb,Microsoft.Bcl 就会崩溃(它会尝试绑定到System.Core
不在系统上的 silverlight 库)
在不安装 KB2468871 的情况下在支持 xp 用户的 .net 4.0 中使用 async/await 的唯一安全方法是在 vs 2010 SP1、nuget microsoft bcl async 中安装 async CTP v3 并实现自己的 AsyncTaskMethodBuilder 和 AsyncVoidMethodBuilder。(并删除异步 ctp dll 引用)
这是 .net4 与 2010 中任何非异步 CTP 异步实现的唯一方法,无需安装 vs 2012、net 4.5 或 KB2468871 即可工作。
任何其他在 .net4 上准备使用的异步实现都使用了在编译过程中实现和桥接异步代码的新方法,这就是为什么您需要安装异步 CTP,它是 .net4 的唯一异步实现,修改 csc编译器来支持它。
微软已经改变了编译器在 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 或 .net 4.0 的 KB2468871,它们都将无法工作。
如果您自己实现 AsyncTaskMethodBuilder 和 AsyncVoidMethodBuilder,它们将全部工作,您甚至可以从 async ctp v3 复制/粘贴它的实现,只需稍作更改,它就会正常工作。
因此,如果您真的担心部署要求和其他与支持 xp 用户相关的事情,我强烈建议您按照我的描述进行操作。
发行说明详细信息:
针对以下任何平台(或更高版本)时:
• .NET Framework 4.0 (with KB2468871)
因此,这意味着您的目标是 4.0 w/KB2468871,因为必须在目标计算机上部署 KB2468871 才能支持该库。
没有关于 Microsoft.Bcl.Async 需要 KB2468871 的哪些部分的详细信息。我建议您联系 BCL 团队,在博客上发帖,或联系 Nuget 包所有者了解更多详细信息。我不清楚知道需要 KB 的哪些部分会有什么不同...
可以在没有 KB2468871 的情况下使用 AsyncBridge 可移植来获得异步/等待功能。https://www.nuget.org/packages/AsyncBridge.Portable/