++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Windows Phone

leave a comment »

Windows Phone 8 SDK

//build/ でも発表されましたが Windows Phone 8 SDK がリリースされました。

実機がないので WP8 アプリを書く気にもれなないんですが、単純に今までの WP7.1~7.5 用としても、今までの WP7 SDK は VS 2012 に対応してなかったので、新しい SDK が必要でして(VS 2010 を入れなおす気ははあんまりない)。

↑WP 7.5、世の中一般に出回ってるわけでもないですが、手元の自分用ツールを久々に更新してみようかと。

Portable Class Library

ただ、その、自分用ツール、機能の大部分を Portable Class Library に移しちゃってたんですよねぇ。 .NET 4.5 & .NET for Win Store 向けに。そして、もちろん、async/await 使いまくり。

WP8 では、普通に Task クラスも async/await も使えるようになっています。が、この自分用ツールは WP 7.5 向け…

てことで、

これの出番かと。

async/await が、 .NET 4、Silverlight 4、WP 7.5 でも使えますというふれこみ。つまるところ、Async CTP 時代と同じもの。そして今回重要なのが、

  • and portable class libraries targeting those platforms (これらのプラットフォームを対象とした PCL でも使えます)

自分用ツールは WP 7.5 なわけで。解決したと思ったんですが…

やってることが Async CTP 時代と一緒なので、Task.FromResult とか Task.Run みたいな、静的メソッドがないんですよね。代わりに TaskEx.FromResult とか TaskEx.Run。クラス名が…

静的メソッドに対して拡張メソッドみたいなことしたいという要望が時々出てるのは知っていたものの、こういう状況で欲しくなるのよなぁ…

Compiler in the Cloud

以前から(プライベート リリースの時点から)話題にはなっていましたけども、結構すごいことしてますよねぇ。

これの、「Much faster code with “Compiler in the Cloud”」のところを見てもらっての通り、ストアのサーバー上で CIL を ARM ネイティブ コード化。実際には MDIL(Machine Dependent Intermediate Language)とかいう形式らしいので、全部が全部 ARM ネイティブ コード化ってわけでもないのかな(それとも、ARM ネイティブ コード + メタデータなのかな?)。

デスクトップ/Windows ストア アプリの方の .NET 4.5 でも、Ngen(実行前のネイティブ コード化)が自動的に(Windowsサービス使って定期メンテ)実行されるようになってるし↓。

もうさすがに、「JIT のコストがもったいないから中間言語方式はダメだ」とか言ってられない感じの時代に。

追記: PCL化 実際やった

WP 7.5 はあきらめて(つまるところ、WP8 実機買うまで自分用ツールの更新あきらめて)Portable Class Library 化してみたり。

  • ターゲットは .NET 4.5、.NET for Windows ストア アプリ、Windows Phone 8 の3つ
  • View Model 丸ごと全部 PCL 側に入った
    • もちろん async/await 使いまくり
    • BindableBase (ストア アプリのテンプレに入ってるやつのコピペ。CallerMemberName 属性とか使っちゃってるやつ)も使えた
  • Windows.winmd の参照はしてない(pure .NET。WinRT 機能は PCL 側では未使用)
  • ターゲットに Phone を入れると WebRequest.GetResponseAsync とかが消えるけども、Bcl.Async を入れれば一応解決
    • ただ、PCL → PCL → Phone みたいな2段階参照すると挙動おかしくなる

ほぼ XAML の書き換えだけで移植できるなぁ、これ。

追記2: PCL から WinRT 利用

これもできるみたい。

確かにいろいろとそれを匂わすものはあったけども。

PCL で winmd を参照できたり:

image

Phone 側、未実装のくせにメソッドだけは持ってるものがあったり:

image

とりあえずためしにやってみた。

image

PCL 内に書いたのは↓みたいなコード。

public class Class1
{
    // デスクトップから呼ぶと ID がありません的エラー
    public static string GetLocalFolderPath()
    {
        return Windows.Storage.ApplicationData.Current.LocalFolder.Path;
    }

    // Phone から呼ぶと UnauthorizedException
    public static async Task<IEnumerable<PictureDescription>> GetFilesInPicturesLibrary()
    {
        var files = await Windows.Storage.KnownFolders.PicturesLibrary.GetFilesAsync(
            Windows.Storage.Search.CommonFileQuery.OrderBySearchRank, 0, 10).AsTask();

       
// 以下略。ここから下は、以前、デスクトップ アプリから WinRT を参照したときのと同じ

ただ、いまいちな感じ:

  • Windows.winmd は参照できるけども、System.Runtime.WindowsRuntime.dll の参照が消えるみたい
    • WinRT の IAsyncInfo とか IAsyncOperation に対する Awaiter や、AsTask メソッドがなくなるので、await できない(自作すれば AsTask は可能)
  • 実行してみないと本当に使えるかどうかわからない(実行時例外が出る)メソッドが多々

PCL 内は普通に pure .NET にしとく方が無難な雰囲気。

広告

Written by ufcpp

2012年10月31日 @ 04:41

カテゴリー: .NET

Tagged with

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。