最低レベルでは、WinRT は ABI レベルで定義されたオブジェクト モデルです。COM をベースとして使用し (したがって、すべての WinRT オブジェクトIUnknown
が refcounting を実装して実行します)、そこからビルドします。古い COM と比較して、かなり多くの新しい概念が追加されています。そのほとんどは .NET から直接提供されています。たとえば、WinRT オブジェクト モデルにはデリゲートがあり、イベントは .NET スタイルで行われます (デリゲートとサブスクライバーの追加/削除を使用)。イベント ソースとシンクの古い COM モデルではなく、イベントごとに 1 つのメソッド)。その他の注目すべき点として、WinRT にはパラメーター化された ("ジェネリック") インターフェイスもあります。
もう 1 つの大きな変更点は、.NET アセンブリと同様に、すべての WinRT コンポーネントでメタデータを使用できるようになったことです。COM では、typelib を使用することでちょっとしたことがありましたが、すべての COM コンポーネントがそれらを持っているわけではありません。WinRT の場合、メタデータは .winmd ファイルに含まれています。Developer Preview の "C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata\" 内を確認してください。調べてみると、実際にはコードのない CLI アセンブリであり、メタデータ テーブルだけであることがわかります。実際、ILDASM で開くことができます。これは、WinRT 自体が管理されているという意味ではなく、単にファイル形式を再利用していることに注意してください。
次に、そのオブジェクト モデルの観点から実装された多数のライブラリがあり、WinRT インターフェイスとクラスを定義します。もう一度、上記の「Windows メタデータ」フォルダーを見て、そこにあるものを確認します。または、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 とは動作が異なります。相互運用アセンブリなどの中間成果物は必要なく/r
、.winmd ファイルだけで、メタデータ内のすべての型とそのメンバーが .NET オブジェクトであるかのように表示されます。WinRT ライブラリ自体は完全にネイティブであることに注意してください (したがって、WinRT を使用するネイティブ C++ プログラムは CLR をまったく必要としません)。すべてのものを管理対象として公開する魔法は、CLR 自体の内部にあり、かなり低レベルです。.winmd を参照する .NET プログラムをイルダスムすると、実際には extern アセンブリ参照のように見えることがわかります。そこには、型の埋め込みなどの巧妙な策略はありません。
これも単純なマッピングではありません。CLR は、可能であれば、WinRT 型を同等のものに適合させようとします。たとえば、GUID、日付、および URI は、それぞれSystem.Guid
、System.DateTime
およびになります。やSystem.Uri
などの WinRTコレクションインターフェイス。等々。これはどちらの場合にも当てはまります。 を実装する .NET オブジェクトがあり、それを WinRT に戻すと、.NET として認識されます。IIterable<T>
IVector<T>
IEnumerable<T>
IList<T>
IEnumerable<T>
IIterable<T>
最終的に、これが意味することは、.NET Metro アプリが既存の標準 .NET ライブラリのサブセットと (ネイティブ) WinRT ライブラリにアクセスできるようになることです。その一部は、特にWindows.UI
API に関して Silverlight と非常によく似ています。UI を定義するための XAML を引き続き使用し、Silverlight と同じ基本概念 (データ バインディング、リソース、スタイル、テンプレートなど) を扱います。多くの場合、Silverlight アプリusing
は新しい名前空間によって簡単に移植できます。 API が調整されたコードのいくつかの場所を微調整します。
WinRT 自体は HTML や CSS とは何の関係もありません。.NET の場合と同様に、そこでも公開されているという意味でのみ JavaScript と関係があります。.NET Metro アプリで WinRT UI ライブラリを使用する場合、HTML/CSS/JS を処理する必要はありません (本当に必要な場合は、WebView
コントロールをホストできます...)。.NET と Silverlight のすべてのスキルは、このプログラミング モデルに非常に関連しています。