[Metro Style] #Win8 #Metro の WinRT と .NET Framework と WinMD と Windows Store と… (ややこしいっ!!)
◆ Metro スタイルで使えるライブラリー
Metro スタイルのプログラミングに挑戦するにあたって、 どんなライブラリーが使えるのかを把握しておきましょう。
よく見かける図では、 Metro スタイルは WinRT を使って作るように描かれています。
※ 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 で検査するしかないようです。
※ 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 での配布を視野に入れているでしょう。 ここに書いたような制限があるということは、 ぜひ頭に入れておいてください。
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
「* プログラミング ( Metro スタイル )」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
- 【#UWP】 15063用の Acrylic Effect を、ちゃんと実装してみる(2017.08.05)
この記事へのコメントは終了しました。
コメント
そのバグは 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分
DateTimeが使えないのは単なるバグ(BUILDの時点で既知のバグ。修正間に合わなかっただけ)みたいですよ。
http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/65079a5e-8fe6-4e00-bbc8-aebf77894068
投稿: 岩永 | 2012年2月 1日 (水) 15時10分