« [Metro Style] #Win8 #Metro スタイルの画面を見てみよう | トップページ | [Metro Style] #Win8 #Metro のアプリケーション・パッケージ »

2012年2月 1日 (水)

[Metro Style] #Win8 #Metro の WinRT と .NET Framework と WinMD と Windows Store と… (ややこしいっ!!)

◆ Metro スタイルで使えるライブラリー

Metro スタイルのプログラミングに挑戦するにあたって、 どんなライブラリーが使えるのかを把握しておきましょう。

よく見かける図では、 Metro スタイルは WinRT を使って作るように描かれています。
20120201_metro01a
BUILD 2011 セッション PLAT-874T "Lap around the Windows Runtime" のスライド (日本語訳: pptx , オンライン閲覧 ) p.6 より。

この図では、 一番右に .NET Framework の上に C# や VB で作ったデスクトップアプリケーションが描かれています (SL は Silverlight)。 中央の緑色の部分が、 WinRT (Windows Runtime API) とその上で動く Metro スタイルアプリケーションです。
WinRT と従来の .NET Framework は、 まったく切り離されているように描かれています。 が、 実際にはそうではありません。

ターゲット利用できるライブラリー確認方法備考
Metro スタイル WinRT、 .NET Framework の一部、 COM の一部 ビルドできれば OK 出典 http://msdn.microsoft.com/en-us/library/windows/apps/hh464942.aspx "Your Metro style apps can also use the subset of traditional Win32, Component Object Model (COM), and .NET Framework APIs"
Metro スタイル (Windows Store 用) 上記より制限される。たとえば Thread.Sleep() は使えない。 Windows App Certification Kit でチェック (後述)
Metro スタイルのバックグラウンドタスク 厳格に WinRT のみ。DateTime 構造体も使えない。 ビルドできれば OK 従来のアセンブリではなく、 WinMD (Windows Metadata) と呼ばれる形式
WinForm や WPF .NET Framework、 COM、 WinRT の一部 ビルドできれば OK 出典 http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/e65f53b4-cac9-44e3-aa10-cd7955d6a9b3 "It is possible to use WinRT from Desktop applications." (MSFT DavidLamb)
※ これまでに集めた情報や、 試してみた経験から、 筆者が判断した。 正式版が出たときの公式見解とは違っている可能性がある。

Metro スタイルから従来の .NET Framework の一部を使えるし、 逆もまた同じです。 ただし、 Windows Store で提供するためには、 使える .NET Framework ライブラリの制限がきつくなります。 また、 Metro スタイルのバックグラウンドタスクを作ろうと思うと、 WinRT だけで書かねばなりません。

(20:00頃、追記) ※ 従来の .NET Framework と WinRT、 それと WinMD、 さらに Metro スタイルアプリケーションのもう一つの作り方である JavaScript との関係について、 詳しくは @ufcpp 氏の 「Metroアプリ ~ WinRT、WinMD、言語プロジェクション」 をご覧ください。

(2012/2/4 追記) ※ Metro スタイルアプリケーションから利用できる従来の .NET Framework (表の最上段に該当) については、 Jeffrey Richter 氏が調べてリストアップしてくれています (DP 版)。  > "Core .NET Types Usable from a Metro Style Application" (2011/9/20)

 
◆ Metro スタイルのバックグラウンドタスク (WinMD)

アプリケーションの実行中にユーザーがスタート画面に切り替えたとき、 アプリケーションが実行し続ける手段は無さそうです。 事前にスレッドを起こして処理を走らせていても、 一時停止 → 強制終了させられてしまうようです。 まぁ、 バッテリー駆動時間に影響するので、 極力バックグランドで走らせるなということなんでしょう。

どうしてもバックグラウンドで処理を実行したければ、 バックグラウンドタスクとして作成する必要がありますが、 それには従来の exe / dll ではなく WinMD にしなければなりません。 この場合、 使えるライブラリーは純粋に WinRT だけとなります。 DateTime 構造体が使えない (DP 版。将来は分かりません) ので、 既存の POCO は壊滅状態となります。


◆ Windows App Certification Kit

やっかいなのは、 Windows Store で配布する Metro スタイルアプリケーションです。
上の表に書いたように、 今のところはビルドしてパッケージに仕立ててから、 Windows App Certification Kit で検査するしかないようです。

20120201_metro02a
BUILD 2011 セッション APP-121T "Introducing the Windows Store" のスライド (日本語訳: pptx , オンライン閲覧 ) p.22 より。

BULD で紹介されたレポート出力の例 (上図) では、 GetTickCount() と Sleep() の使用が "FAILED" とレポートされています。 このままでは、 Windows Store で配布させてもらえないことになります。

繰り返しになりますが、 ちゃんとコンパイル/ビルド出来て、 問題無く動作していても、 Windows App Certification Kit で 「使っちゃダメ!」 と怒られる API があるのです。 Visual Studio 11 の正式版では、 インテリセンスとかビルド時に警告してくれるようになっていて欲しいものです。

Metro スタイルのアプリケーションを考えている人の多くは、 Windows Store での配布を視野に入れているでしょう。 ここに書いたような制限があるということは、 ぜひ頭に入れておいてください。

|

« [Metro Style] #Win8 #Metro スタイルの画面を見てみよう | トップページ | [Metro Style] #Win8 #Metro のアプリケーション・パッケージ »

プログラミング」カテゴリの記事

* プログラミング ( Metro スタイル )」カテゴリの記事

コメント

DateTimeが使えないのは単なるバグ(BUILDの時点で既知のバグ。修正間に合わなかっただけ)みたいですよ。
http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/65079a5e-8fe6-4e00-bbc8-aebf77894068

投稿: 岩永 | 2012年2月 1日 (水) 15時10分

そのバグは Windows.Foundation.DateTime
http://msdn.microsoft.com/en-us/library/windows/apps/windows.foundation.datetime (←このページの記述も怪しいけどw)
が DP 版では使えない、 って話ですよね。

しかし Windows.Foundation.DateTime は、 マネージドコードでは System.DateTimeOffset にマッピングされるはずです。 それは、
http://msdn.microsoft.com/en-us/library/windows/apps/br230301%28v=vs.110%29.aspx
にチョロっと書かれています。
"(Usually the two types have the same name. Note, however, that the Windows.Foundation.DateTime structure appears in managed code as System.DateTimeOffset and not as System.DateTime.)"

そこに書かれていることが正しいなら、 System.DateTime は WinRT にマッピングされない、 ということですよね。 つまり、 既存の POCO を持ち込むときに、 DateTime は DateTimeOffset に直さなければならない、 と。

まぁ、 この機会に DateTimeOffset を使うように改宗せい、 ってことではあります f(^^;

投稿: biac | 2012年2月 1日 (水) 17時25分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/209349/53876227

この記事へのトラックバック一覧です: [Metro Style] #Win8 #Metro の WinRT と .NET Framework と WinMD と Windows Store と… (ややこしいっ!!):

« [Metro Style] #Win8 #Metro スタイルの画面を見てみよう | トップページ | [Metro Style] #Win8 #Metro のアプリケーション・パッケージ »