Windowsランタイム

Windowsランタイム  はマイクロソフトによる新しいプログラミングモデルであり、Modern UIスタイルのアプリケーションを作成するバックボーンとなるAPIである。Windows 8以降のオペレーティングシステムで実装されている。 WinRTはネイティブ言語拡張であるC++/CX 、マネージ言語であるC#およびVB.NET、そしてスクリプト言語であるJavaScriptおよびTypeScriptによる開発に対応する。Windows SDKバージョン 10.0.17134.0 以降は、C++/WinRTを選択することもできる。

WinRTはx86/x64/ARM/ARM64をネイティブサポートし、またサンドボックス環境内で動作することで従来のデスクトップアプリケーションよりもセキュリティや安定性を高めることができるWindows 8.xの時点ではx86/x64/ARMのみだったが、Windows 10のユニバーサルWindowsプラットフォームでは64ビットARMすなわちARM64のサポートも追加された。}}。

1. 概要
-----

WinRTはC++言語によって実装された、オブジェクト指向設計にもとづく近代的なAPIである。また、COMに基づいたネイティブAPIであり、COMのように複数の言語から利用することができる。

従来のCOMとの違いのひとつとして、WinRT APIの定義は".winmd"ファイルに格納されており、ECMA 335メタフォーマットでエンコードされている。同じフォーマットはいくらかの改変を加えた形で.NETでも用いられている。この共通のメタフォーマットにより、従来のP/Invokeと比較して非常に小さなオーバーヘッドでWinRTを.NETアプリケーションから呼び出すことが可能になる。また従来のCOMコンポーネントを.NET言語から直接利用するためには、.NET用にCOMタイプライブラリをインポートするか、COMインターフェイス定義を.NET言語で明示的に記述してラッパーを作成する必要があったが、WinRTではその必要がなくなり、ラッパーを作成することなくWinRTコンポーネントを.NET言語から直接利用できるようになる。また、その逆もしかりであり、.NET言語で作成したWinRTコンポーネントをC++/CXで直接利用することも可能である。文法もよりシンプルになる。

新しいC++/CX  言語はC++/CLIの文法をいくつか借用しており、C++によるクラシックなCOMプログラミングよりも少ないグルーコードでWinRTコンポーネントの作成や利用が可能である。また、C++/CLIと比較して、純粋C++型とWinRT型が混在する場合において課される制約がほとんどないC++/CLIにおいては、ガベージコレクションにかかわることから、ネイティブ型にマネージ型のインスタンスを含める場合、gcrootクラステンプレートによるラップが必要になる。通常のC++も、新しいテンプレートライブラリであるWindows Runtime C++ Template Library  で補助することでWinRTコンポーネントをプログラミングする際に利用可能である。目的としては、WRLはCOM用にATLが提供しているものに似ているが、いくつかの機能が省略されている。なお、のちに標準C++17をベースとした言語プロジェクションとしてC++/WinRTが開発され、C++/CXおよびWRLの代替として推奨されるようになった。

例えば従来のデスクトップアプリケーションの場合、C#コードからC++コードを再利用するときや、あるいはC++コードからC#コードを再利用するときは、いずれもP/Invoke、COM相互運用、もしくはマネージ言語であるC++/CLIによるラッパーを介する必要があったが、WinRTの場合はネイティブ拡張であるC++/CXまたはC++/WinRTを介することで相互運用可能なコンポーネントを作成・利用できるため、明示的にP/Invokeやマネージ言語を介する必要がなくなる。

2. 歴史
-----

WinRTは、2011年9月12日のMicrosoft Buildカンファレンスで明らかになり、Windows 8の開発者プレビューに含まれていた。また、最初のC++/CXとWinRT開発環境のサポートは、Visual Studio 2012のプレビュー版であるVisual Studio 11に含まれていた。正式版となったVisual Studio 2012にはWindows 8向けのWinRT開発環境が、そして後継のVisual Studio 2013にはWindows 8.1向けのWinRT開発環境が含まれている。Visual Studio 2013ではWindows 8向けのWinRTアプリケーションを開発することはできないが、Visual Studio 2012と2013は共存可能である。

Visual Studio 2015にはWindows 10向けのWinRT開発環境が含まれている。Visual Studio 2015では、引き続きWindows 8.1向けのWinRTアプリケーション開発もサポートされる。

3. 技術
-----

WinRTコンポーネントは、ネイティブ、マネージコード、スクリプティングを含む複数の言語とABIの間の相互運用性を視野に入れて設計されている。

WinRTアプリケーションはサンドボックス内で実行される。そのため、従来のデスクトップアプリケーションと比べてインストールや動作に関する制約が設けられるものの、セキュリティ面での安全性は向上する。WinRT APIは、従来のデスクトップ版Win32 APIと一部を共有するWin32 APIサブセットの上に構築されており、Win32 APIの代替というよりはむしろ高レベルのラッパーであるといえる。これは内部実装にWin32 APIを利用しているMicrosoft .NET Frameworkで使われているのと同じアプローチである。

4. サービス
-------

4.1. メタデータ
----------

WinRTメタデータはWinRTに対して書かれたコードを補足する。プログラミング言語にかかわらずオブジェクト指向的なプログラミングモデルを定義し、リフレクションなどの機能も提供する。 マイクロソフトのC++専門家であるハーブ・サッターは、BUILDカンファレンスにおいて、WinRTメタデータは.NETメタデータと同じものであると説明している。ネイティブコードにはメタデータを含めることはできず、別にWINMDファイルとして保存される。その場合でもリフレクションは.NETアセンブリ同様に動作する。

.NETメタデータと同じものなので、WinRTに対してネイティブ言語で開発されたコードは.NET上のプログラミング言語からも利用することができる。

4.2. 型システム
----------

WinRTはメタデータに基づいた、リッチなオブジェクト指向のクラスベース型システムを持っている。WinRTは.NET Frameworkにみられるような、クラス、メソッド、プロパティ、デリゲートおよびイベントといった構成概念に対応するものをサポートする。

COMと比較して、WinRTに追加された主要なもののうちのひとつは、クロスABIで.NETスタイルのジェネリクスである。C++/CXにおいて、ジェネリクスはgenericキーワードを用いて宣言され、templateキーワードを用いた構文と非常によく似た構文を持つ。WinRTのクラス  は、C++のテンプレートを用いてジェネリック化することもできるが、.winmdメタデータにエクスポートすることはできない。つまり、privateな可視性を持つWinRTクラスのみをテンプレートとすることができ、またテンプレートを特殊化した型はWinRTクラスのprivateなメンバーとしてのみ利用可能である。一方WinRTのジェネリクスはジェネリック性  をメタデータ内に保存する。WinRTはまた、ジェネリックなコンテナのライブラリを提供する。これは標準C++ライブラリのSTL  コンテナと似たものであり、C++/WinRTではSTLコンテナとWinRTコンテナとの相互変換機能もいくつか用意されている。.NET言語およびJavaScriptにおけるWinRTコレクションの利用は、C++の場合よりも透過的である。これは暗黙的に行なわれる、各言語における等価な型への自動的なマッピングによって実現される。マネージ言語でWinRTコンポーネントを記述するとき、COMとよく似たスタイルの規則に従う必要がある。例えば、公開されたメソッドやプロパティの戻り値およびパラメータとして宣言することができる型は、WinRT型またはWinRT互換型に限られるため、.NETコレクション型を直接使用することができない。同様に、C++では内部的なコードに関してはSTLやその他の型を自由に使用できるが、ABI境界を超える場合はWinRT型を使用する必要がある。

WinRTの文字列はHSTRING型として実装されているが、詳細は公開されていない不透明な型  である。HSTRINGは、C++/CXではPlatform::Stringに、C++/WinRTではwinrt::hstringに、.NETではSystem.Stringに、JavaScriptでは組み込みのStringオブジェクトにマッピングされる。

4.2.1. WinRT コンポーネント
--------------------

WinRTを対象とするようにコンパイルされたクラスは、//WinRTコンポーネント//と呼ばれる。これらはサポートされている任意の言語およびプラットフォームで使用できる自己完結型のクラスである。これらのクラスにはメタデータが定義されており、多くの言語からコンポーネントを呼び出すことが可能となる。ランタイムでは、定義済みのインターフェイスタイプまたは.NETタイプのインターフェイスを使用するために.NET Frameworkで構築されたWinRTコンポーネントが必要となる。これらのインターフェイスは、デフォルト名に自動的にマップされる。継承は、XAMLクラスを除いて、マネージドWinRTコンポーネントではまだサポートされていない。

4.3. プログラミングインターフェイス
--------------------

WinRTランタイムを対象としたプログラムとライブラリは、多くのプラットフォームとプログラミング言語から作成および使用できる。C/C++、 .NET、およびJavaScriptなどから使用できる。これはメタデータによって可能となる。

WinRTの文脈では、言語バインディングは//言語プロジェクション//と呼ばれる。

4.3.1. C++ 
-----------------------------------

C++は、WinRT自体の開発言語であり、当然最も自然な形で利用することができる。C++からWinRTを使用する方法には、2つの選択肢があり、一つはWRLであり、もう一つはC++/CLIに似たC++/CX である。

違いとしては設計上WRLには例外が存在せず、実行結果の如何に関わらずCOMと同様のHRESULTベースの戻り値が返る。その一方で、C++/ CXは、WinRTへの呼び出しに対してエラーチェックを実行し、必要に応じて例外をスローするラッパーとなっている。

また、C++/CXでは、プラットフォームとその型システムとの統合を可能にする多くの拡張機能が実装されている。構文はC++/ CLIの構文に似ているが、ランタイムと統合するネイティブコードとメタデータを生成する。例えば、WinRTオブジェクトはref newでインスタンス化できるが、これはC++/CLIのgcnewに相当する。ハンドル宣言子の用法は変わらないが、呼び出し元と呼び出し先の両方がC++で記述されており、同じプロセスに存在する場合、ハット参照は単にvtableへのvptrポインタを返す。

WinRTはネイティブプラットフォームであり、任意のネイティブC++コードをサポートする。C ++開発者は、ランタイムとインターフェイスするコードを作成するときに言語拡張機能を使用するだけで、既存のネイティブC /C++ライブラリを再利用することができる。

4.3.2. .NET
-----------

.NETFrameworkと共通言語ランタイムは、サブプラットフォームとしてWinRTに統合されている。また、メタデータ形式やライブラリの設計など、WinRTプラットフォームの設計や実装の随所にその影響がみられる。.NETにおけるWinRTはマネージドオブジェクトとして実装されており、Win32APIのようにユーザーがハンドルなどを管理する必要はない。

WinRTは、主にC＃およびVB.NETで記述されたXAMLベースの.NET Metroスタイルのアプリケーションをサポートする。正式なサポートとはされていないが、当然他の.NET言語から使用することもできる。

4.3.3. JavaScript
-----------------

WinRTはJavaScriptからの利用も想定されている。MicrosoftはHTML5とJavaScriptをWindows 8の開発エクスペリエンスの一部として統合するとしており、InternetExplorer9用に開発された「Chakra」JavaScriptエンジンはWinRTと統合されていた。

JavaScriptでのWinRTの利用においては、WinRTの機能をJavaScriptの命名規則に従って適応させるなど、内部でいくつかの特殊な処理を行っている。

名前空間はJavaScriptオブジェクトにマップされており、いくつかの特別なメンバーを追加するなどの対応がなされている。

メトロインターフェースは、コードビハインドでHTML5とCSSおよびJavaScriptを使用して構築されている。

現在のバージョンはJavaScript 5である。

4.4. API
--------

WinRTは、Modern UIのような、Windows 8の機能を開発者に公開するクラスライブラリの形でApplication Programming Interface  を搭載している。WinRTはサポート対象となるあらゆる言語から利用可能である。

4.4.1. Windowsクラス
-----------------

Windowsクラスは、WinRTによって公開されるネイティブな低レベルのC/C++ライブラリである。XAMLパーサーからカメラ機能までの すべての機能へのアクセスを提供する。

4.4.2. 命名規約
-----------

APIのコンポーネントの命名規則は、キャメルケースを使用しているが、JavaScriptのように異なる命名規約を持つ言語ではその言語の命名規則に沿った形で提供されている。

5. 脚注
-----

5.1. 注釈
-------

5.2. 出典
-------

6. 関連項目
-------

Microsoft Windows 8
Microsoft Windows 10
Windowsストア
ユニバーサルWindowsプラットフォーム

7. 外部リンク
--------

[1]