不吃苦瓜 发表于 2013-1-4 01:19:37

Windows phone 7 移植到 Windows phone 8 之(AsyncCtpLibrary_Phone 的错误与异常)

<div id="cnblogs_post_body">
1.先说下背景。
之前研究了下Async-CTP-v3 异步编程的方式。发现可以使程序从逻辑上清晰无比,然后就在vs2010安装了Async-CTP-v3。
并在工作的项目中重写了http访问层,主要用到了Task,async,await等关键字和像GetRequestStreamAsync()这种类型的扩展方法。

2.主要的内容。
下面先说下wp8 SDK的迁移从以前的wp7项目
用vs2012打开vs2010的vs项目会弹出一个htm迁移报告,就是这个。有警告的2个项目都不是重要的,让我很欣慰。
http://pic002.cnblogs.com/images/2012/337537/2012103123441584.png
然后接下来我编译了一遍项目。说找不到关键字。
http://pic002.cnblogs.com/images/2012/337537/2012103123463463.png
由于可能这还是7.1的项目吧。我将项目都升级到wp8.0.升级到wp8.0的方法就是在解决方案管理器里面,右键每一个项目,点击升级到
windows phone 8.0,在升级的时候,有的项目会短暂无反应。一会就好了。然后编译,就发现了主要问题。
主要说是一个System.Threading.Tasks.Task这个类在AsyncCtpLibrary_Phone.dll和mscorlib.dll中同时存在。
http://pic002.cnblogs.com/images/2012/337537/2012103123565118.png
然后我想那就把之前的AsyncCtpLibrary这个从引用中移除。~~.然后就发现之前在AsyncCtpLibrary这个里面的一些扩展方法都不见了。也就是说新的sdk
包含了支持了await,async,但AsyncCtpLibrary_Phone.dll这个dll中的扩展方法是没有给的。这真心坑呀。我重写引回去,扩展方法是有了,但是2个程序集
中都有Task这个类。编译就会报错。。。。。。。。。。。

3.现在的解决方案。
我用.net reflector反编了AsyncCtpLibrary_Phone这个dll。看到了里面有2个扩展方法的类。还有一些命名空间。
http://pic002.cnblogs.com/images/2012/337537/2012110100075210.png
找到了我想要的GetRequestStreamAsync()方法。然后就在项目里面自己写了这个扩展方法。当然这里的扩展方法很多。别的扩展方法与这个就类似了。
<div class="cnblogs_code">    public static class AsyncCtpLibrary    {      public static Task<Stream> GetRequestStreamAsync(this WebRequest source)      {            return Task<Stream>.Factory.FromAsync(new Func<AsyncCallback, object, IAsyncResult>(source.BeginGetRequestStream), new Func<IAsyncResult, Stream>(source.EndGetRequestStream), null);      }    }
页: [1]
查看完整版本: Windows phone 7 移植到 Windows phone 8 之(AsyncCtpLibrary_Phone 的错误与异常)