1. ホーム
  2. wpf

[解決済み] Windows 8 ランタイム(WinRT / Windowsストアアプリ / Windows 10 ユニバーサルアプリ)とSilverlightやWPFの比較はどうですか?[クローズド]

2022-03-15 10:35:18

質問内容

Windows 8 の新しいランタイムを理解しようとしています。 メトロ スタイルアプリを開発しました。を使うことができるのは知っています。 XAML で、.NETベースなのでC#やVB.NETでアプリが書けるのですが、そうなると、HTML、CSS、DOM、JavaScriptが関係してくるようです。

どなたか、.NET UIプログラマーが理解できる言葉で、それが何であるかを少し説明していただけませんか?(私はそれを理解するために必要な「鍵」のようなものを見逃しているのです)。


WPFはみんな知っている。 シルバーライト , Windowsフォーム などは、少なくともIntelシステム上ではWindows 8(およびWindows 10)でも動作し続けるので、そんなことは言わないでください...。

解決方法は?

WinRTは、最下層では、ABIレベルで定義されたオブジェクト・モデルです。これは、COMをベースとしています(したがって、すべてのWinRTオブジェクトは、COMを実装しています)。 IUnknown そして、そこから構築していきます。例えば、WinRTのオブジェクト・モデルにはデリゲートがあり、イベントは、イベント・ソースとシンクという古いCOMモデルではなく、.NETスタイル(デリゲートとイベントごとのサブスクライバー・メソッドの追加と削除)で実行されます。また、WinRTは、パラメトリックな("generic")インターフェースを持っているのも特徴です。

もうひとつの大きな変更点は、すべてのWinRTコンポーネントが、.NETアセンブリと同様に、メタデータを利用できることです。COMでは、typelibsによってメタデータが提供されていましたが、すべてのCOMコンポーネントがメタデータを持っているわけではありませんでした。WinRTの場合、メタデータは.winmdファイルに含まれています。Developer Previewでは、C:³³ Files (x86)³³³Windows Kits³.0Windows Metadata³³³の中を見てください。このように、Developer PreviewにあるWindows Metadataは、CLIアセンブリで、コードはなく、メタデータ・テーブルだけであることがわかります。実際、ILDASMで開くことができます。なお、これはWinRT自体が管理されているわけではなく、単にファイル形式を再利用しているだけです。

そして、そのオブジェクトモデルに基づいて実装された、WinRTのインターフェースやクラスを定義したライブラリが多数あります。また、VSでオブジェクトブラウザを起動し、フレームワークセレクタで「Windows 8.0」を選択すると、何が含まれているかを確認できます。そこには多くのものがあり、UIだけを扱っているわけではありません。 Windows.Data.Json または Windows.Graphics.Printing または Windows.Networking.Sockets .

そして、UIに特化したいくつかのライブラリができあがります - ほとんどの場合、これらは Windows.UI または Windows.UI.Xaml . これらの多くは、WPF/Silverlight の名前空間と非常によく似ています。 Windows.UI.Xaml.Controls は密接にマッチしている System.Windows.Controls についても同様です。 Windows.UI.Xaml.Documents などです。

さて、.NETには、WinRTコンポーネントを.NETアセンブリであるかのように直接参照できる機能があります。これはCOM Interopとは異なる動作で、Interopアセンブリのような中間成果物を必要とせず、単に /r .winmdファイルを作成すると、そのメタデータにあるすべての型とそのメンバが、あたかも.NETオブジェクトであるかのように表示されるようになります。WinRTのライブラリ自体は完全にネイティブです(したがって、WinRTを使用するネイティブC++プログラムは、CLRを全く必要としません) - すべてのものをマネージドとして公開するマジックは、CLR自体の中にあり、かなり低レベルであることに注意してください。.winmdを参照する.NETプログラムをildasmすると、それが実際には外部アセンブリ参照のように見えることがわかるでしょう - そこには、型埋め込みなどの巧妙なトリックはありません。

CLRは、可能な限りWinRTの型をその同等品に適応させようとするのです。例えば、GUID、日付、URIは、以下のようになります。 System.Guid , System.DateTimeSystem.Uri のようなWinRTのコレクションインターフェイスは、それぞれ IIterable<T>IVector<T> になる IEnumerable<T>IList<T> といった具合です。これは両方向に当てはまります。例えば、.NETオブジェクトで IEnumerable<T> それをWinRTに渡すと、WinRTはそれを IIterable<T> .

最終的には、.NET Metroアプリは、既存の標準.NETライブラリのサブセットと、(ネイティブの)WinRTライブラリにアクセスすることができます。 Windows.UI - は、API的にはSilverlightと非常によく似ています。UI を定義するために XAML を使用し、データバインディング、リソース、スタイル、テンプレートなど、Silverlight と同じ基本概念を扱うことができます。多くの場合、Silverlightアプリを移植するには、単に using 新しい名前空間と、APIが調整されたコードのいくつかの場所を微調整してください。

WinRT自体は、HTMLやCSSとは関係なく、JavaScriptとの関係も、.NETと同じように、そこで公開されるという意味合いだけです。.NET MetroアプリでWinRTのUIライブラリを使う場合、HTML/CSS/JSを扱う必要はない(まあ、どうしても使いたいなら WebView コントロールになります...)。.NETとSilverlightのスキルは、このプログラミングモデルにも大いに関係します。