Windows Runtime ( WinRT ) は、プラットフォームに依存しないコンポーネントおよびアプリケーション アーキテクチャであり、 2012 年にWindows 8およびWindows Server 2012で初めて導入されました。C++ で実装されており、 C++ ( C++/WinRT、C++/CX、または WRL経由)、Rust/WinRT、Python/WinRT、JavaScript - TypeScript、およびマネージド コード言語であるC#とVisual Basic (.NET) (VB.NET) での開発を公式にサポートしています。
WinRT は、従来の意味でのランタイムではなく、 COMに基づく言語非依存のアプリケーションバイナリインターフェイスであり、オブジェクト指向 API を複数の言語から利用できるようにし、通常は型アクティベーションなどのフル機能のランタイムによってサービスが提供されます。[ 1 ]つまり、WinRT は「API 配信システム」です。Windows ランタイムを使用するアプリは、サンドボックス環境内で実行してセキュリティと安定性を高めることができ、x86とARMの両方をネイティブにサポートできます。[ 2 ] [ 3 ] WinRT コンポーネントは、ネイティブ言語、マネージド言語、スクリプト言語など、複数の言語と API 間の相互運用性を念頭に置いて設計されています。WinRT ABI を使用する Windows によって提供される組み込み API は、一般的に WinRT API として知られていますが、誰でも独自の API に WinRT ABI を使用できます。
WinRT はプログラミング言語C++ [ 4 ]で実装されており、設計上オブジェクト指向です。 [ 4 ]基盤となるテクノロジーであるWindows API (Win32 API) は、主にC言語で記述されています。[ 5 ]これは、コンポーネント オブジェクト モデル(COM)に基づく管理されていないアプリケーション バイナリ インターフェイスであり、COM と同様に複数の言語からのインターフェースを可能にします。ただし、API 定義はファイルに格納され、.NET Frameworkもいくつかの変更を加えて使用するECMA 335 メタデータフォーマットでエンコードされています。ネイティブ コードで実装された WinRT コンポーネントの場合、メタデータ ファイルにはメソッド、クラス、インターフェイス、列挙の定義のみが含まれ、実装は別の DLL で提供されます。[ 6 ] [ 7 ] [ 8 ]この共通のメタデータ フォーマットにより、 P/Invokeよりも簡単な構文で .NET アプリケーションから WinRT API を簡単に使用できるようになります。[ 9 ] Windows は、WinRT ABI をベースに構築された一連の組み込み API を提供しており、XAML ベースのWinUIライブラリからカメラ、マイクなどのデバイスへのアクセスまで、あらゆる機能を提供します。.winmd
以前のC++/CX (コンポーネント拡張) 言語は、C++/CLI の構文を一部借用しており、従来の C++ での COM プログラミングに比べてプログラマーから見える接着コードが少なく、型を混在させる際の C++/CLI に対する制約が少ない WinRT コンポーネントの記述と使用のために導入されました。C++/CX のコンポーネント拡張は、API 境界でのみ使用することが推奨されており、他の目的での使用は推奨されていません。[ 10 ]通常の C++ (COM 固有の規律付き)も、Windows Runtime C++ テンプレート ライブラリ (WRL) の助けを借りてWinRT コンポーネントを使用してプログラミングできます。[ 11 ]これは、COM 用のActive Template Libraryと同様の目的です。[ 12 ] 2019 年に、Microsoft はC++/WinRTヘッダー ライブラリを優先して C++/CX を非推奨にしました。[ 13 ]
ほとんどのWinRTアプリケーションはサンドボックス内で実行され、重要なOS機能や基盤となるハードウェアにアクセスするには明示的なユーザー承認が必要です。デフォルトでは、ファイルへのアクセスは、ドキュメントやピクチャなどのいくつかの事前定義された場所に制限されています。[ 14 ]
WinRT アプリケーションは、.appx ファイル形式、後に .msixファイル形式でパッケージ化されます。Open Packaging Conventionsに基づいて、 XML ファイルを追加したZIP 形式を使用します。[ 15 ] WinRT アプリケーションは、主にMicrosoft Storeというアプリケーション ストアを通じて配布され、そこで Windows アプリ ( Windows ストア アプリと呼ばれます) をユーザーが購入してダウンロードできます。当初、WinRT アプリは、Windows ドメインの一部である Windows 8 または RT システムで、または Microsoft から取得した特別なアクティベーション キーが装備されている場合のみ、 Windows Store 以外からサイドロードできました。 [ 16 ] [ 17 ] [ 18 ] [ 19 ]しかし、これらの制限は Windows 10 November Update で解除され、設定を有効にすることで、信頼できる証明書で署名された任意のアプリを自由にサイドロードできるようになりました。[ 20 ]
Win32 とは大きく異なり、.NET Framework 4.5と同様に、完了までにかなりの時間がかかると予想されるほとんどの API は非同期として実装されています。Windows ランタイムの非同期関数を呼び出すと、タスクは別のスレッドまたはプロセスで開始され、関数はすぐに戻り、結果を待っている間にアプリが他のタスクを実行できるようになります。[ 21 ]非同期モデルには、新しいプログラミング言語の構造が必要です。各言語は、非同期API を使用するための独自の方法を提供します。非同期アクセスが必要な組み込み API の一部には、画面上のメッセージとダイアログ、ファイル アクセス、インターネット接続、ソケット、ストリーム、デバイスとサービス、カレンダー、連絡先、予定などがあります。
メタデータは、WinRT ABIを使用して記述されたAPIを記述します。これは、複数のプログラミング言語間で共有可能なオブジェクト指向コードの記述を可能にするプログラミングモデルを定義し、リフレクション(反射)などのサービスを実現します。
MicrosoftのC++エキスパートであるHerb Sutter氏は、 2011 年のBuild カンファレンスでの C++ に関するセッションで、 WinRT メタデータはCLI メタデータと同じ形式であると説明しました。[ 10 ]ネイティブ コード (つまり、プロセッサ固有のマシン コード) にはメタデータを含めることができないため、通常のCLI アセンブリのように反映できる別のメタデータ ファイルに格納されます。[ 22 ] CLI メタデータと同じ形式であるため、WinRT API は、単なる .NET API であるかのように、マネージドCLI 言語から使用できます。
WinRTは、メタデータに基づいて構築された、豊富なオブジェクト指向クラスベースの型システムを備えています。.NETフレームワークの対応する構成要素(クラス、メソッド、プロパティ、デリゲート、イベント)をサポートしています。
COM と比較した WinRT の主要な追加機能の 1 つは、クロスアプリケーション バイナリ インターフェイス(ABI)、つまり .NET スタイルのジェネリクスです。インターフェイスとデリゲートのみがジェネリックにすることができ、ランタイム クラスとその中のメソッドはジェネリックにできません。ジェネリック インターフェイスは、パラメーター化インターフェイスとも呼ばれます。C++/CX では、genericキーワードと非常によく似た構文でキーワードを使用して宣言されますtemplate。WinRT クラス (ref クラス) も C++ テンプレートを使用してジェネリック化できますが、テンプレート インスタンス化のみが (名前のマングリングを伴って) .winmd メタデータにエクスポートできます。これは、メタデータでジェネリック性を保持する WinRT ジェネリックとは異なります。WinRT は、 C++ 標準ライブラリのものと並行するジェネリックコンテナ用のインターフェイス セットも提供しており、言語は相互 (双方向) 変換関数を提供します。.NET 言語 (C# や VB など) および JavaScript での WinRT コレクションの使用は、C++ よりも透過的であり、自然な同等物への自動マッピングがバックグラウンドで行われます。マネージド言語でWinRTコンポーネントを作成する場合、COMスタイルの追加のルールに従う必要があります。たとえば、.NET Frameworkのコレクション型を戻り値の型として宣言することはできませんが、コンポーネントの境界では、それらが実装するWinRTインターフェイスのみを使用できます。
WinRT をターゲットにコンパイルされたクラスは、WinRT コンポーネントと呼ばれます。これらは、サポートされている任意の言語で、サポートされている任意のプラットフォーム向けに記述できるクラスです。重要なのはメタデータです。このメタデータにより、他の WinRT 言語からコンポーネントとインターフェースすることが可能になります。ランタイムは、.NET Framework で構築された WinRT コンポーネントが、定義済みのインターフェイス型または .NET 型インターフェイスを使用することを要求します。これらは、最初に名前が付けられたインターフェイスに自動的にマッピングされます。マネージド WinRT コンポーネントでは、XAML クラスを除き、継承はまだサポートされていません。[ 23 ]
WinRTランタイム向けのプログラムやライブラリは、複数のプラットフォームやプログラミング言語から作成・利用できます。特に、C / C++(WinRTの概念を第一級サポートする言語拡張機能を使用する場合と、標準C++でコードを記述できる低レベルのテンプレートライブラリを使用する場合)、.NET(C#およびVisual Basic (.NET) (VB.NET))、JavaScriptなどが挙げられます。これはメタデータによって実現されます。WinRTの用語では、言語バインディングは言語プロジェクションと呼ばれます。
標準 C++ はWinRT プラットフォームの第一級市民です。Windows 10 バージョン 1803 以降、Windows SDK には C++/WinRT が含まれています。C++/WinRT は、Windows ランタイム (WinRT) API 用の完全に標準的な最新の C++17 言語プロジェクションであり、ヘッダー ファイル ベースのライブラリとして実装され、最新の Windows API への第一級アクセスを提供するように設計されています。C++/WinRT を使用すると、Windows ランタイム API は、標準に準拠した任意の C++17 コンパイラを使用して作成および利用できます。WinRT はネイティブ プラットフォームであり、任意のネイティブ (および標準) C++ コードをサポートするため、C++ 開発者は既存のネイティブ C/C++ ライブラリを再利用できます。C++/WinRT には言語拡張機能はありません。
C++ から WinRT を使用するための他の 2 つの従来のオプションがあります。1 つは、ATLスタイルのテンプレート ライブラリ ( Windows テンプレート ライブラリまたは WTLに類似) である Windows Runtime C++ テンプレート ライブラリ (WRL) と、 C++/CLI に類似したC++/CX (コンポーネント拡張機能付き C++) です。 [ 24 ] Microsoft の内部使用要件のため、WRL は例外フリーであり、その戻り値の規律はCOM と同様にHRESULTベースです。 [ 25 ]一方、C++/CX は、エラー チェックを行い、必要に応じて例外をスローするコードで WinRT への呼び出しをラップします。[ 26 ]
C++/CX には、プラットフォームとその型システムとの統合を可能にする拡張機能がいくつかあります。構文はC++/CLIの構文に似ていますが、ランタイムと統合されるネイティブ (標準ではない) コードとメタデータを生成します。たとえば、WinRT オブジェクトはref new、C++/CLI の に対応するで割り当てることができますgcnew。ハット演算子の^意味は保持されますが、呼び出し元と呼び出し先の両方が C++ で記述され、同じプロセスで実行されている場合、ハット参照は単に仮想メソッドテーブル(vtable、VMT) への vptr へのポインタになります。[ 26 ]
C++/CX と並んで、従来の C++ COM プログラミングと比較すると、部分クラスという概念があります。これもまた .NET にヒントを得たものです。部分クラスを使うことで、 WinRT XAMLのインスタンスコードをツールによって C++ コードに変換し、それを人間が記述したコードと組み合わせることで完全なクラスを生成できます。同時に、機械生成部分と人間編集部分を別々のファイルに明確に分離することも可能です。
.NET FrameworkとCommon Language Runtime (CLR) は、サブプラットフォームとして WinRT に統合されています。メタデータ形式とライブラリを通じて、エコシステムに影響を与え、標準を設定してきました。CLR は、JIT コンパイルコードやガベージコレクションなどのサービスを提供します。.NET 言語を使用する WinRT アプリケーションは、XAML ベースのWinUI を使用し、主に C#、VB.NET、そして初めて XAML 用にC++/CX を使用したネイティブコードで記述されています。まだ公式にはサポートされていませんが、他の .NET 言語でプログラムを作成することもできます。.NET 5 では、Microsoft は組み込みの WinRT サポートを削除し、代わりに C++/WinRT の動作と同様に Windows Runtime API にアクセスするための相互運用コードを生成するツールである CsWinRT を作成しました。[ 27 ] [ 28 ]
マネージド .NET 言語で構築された WinRT コンポーネントで定義されたクラスは、として宣言する必要があるsealedため、から派生することはできません。ただし、他の場所で定義された非シール WinRT クラスは、.NET でから継承したり、仮想メソッドをオーバーライドしたりすることができます。ただし、継承されたマネージド クラスは、引き続きシールされている必要があります。
他の言語とインターフェースするメンバーは、WinRT 型またはそれらに変換可能なマネージド型を持つシグネチャを持つ必要があります。[ 23 ]
WinRT アプリケーションは、 HTMLとコードビハインド内のJavaScriptを使用してコーディングすることもできます。これらのアプリケーションは、 Internet Explorerでも使用されているTridentレンダリングエンジンとChakra JavaScript エンジンを使用して実行されます。WinRT アプリケーションを JavaScript でコーディングする場合、その機能は JavaScript の命名規則に従うように調整され、名前空間も JavaScript オブジェクトにマッピングされます。
Microsoft は、WinRT API を C++ 以外の言語に展開する作業を進めています。その一例として、Rust/WinRT があります。これは、 Rustで書かれたプログラムがWinRT API を利用したり作成したりするためのインターフェースです。[ 29 ] Rust/WinRT は、従来の Windows デスクトップと UWP アプリ モデルを調和させるための Microsoft の取り組みであるWindows App SDK (旧 Project Reunion)の一部です。[ 30 ]
ユニバーサル Windows プラットフォーム(UWP)の導入に伴い、このプラットフォームには多くの API ブリッジが提供され、元々他のプラットフォーム向けに開発されたプログラムを UWP の機能を活用しながら簡単に移植できるようになりました。マイクロソフトは、Android (2016 年以降サポート終了)、iOS ( Cocoa Touch )、プログレッシブ Web アプリ、Silverlight、および従来の Windows デスクトップ アプリ ( Windows App SDKの MSIX パッケージを使用) 向けのブリッジを提供しています。
WinRTには、クラスライブラリの形式をとるアプリケーションプログラミングインターフェイス(API)が付属しており、開発者向けにWindows 8の機能を利用可能にします。例えば、没入型インターフェイスAPIなどが挙げられます。このAPIは、サポートされているあらゆる言語からアクセスおよび利用できます。
Windowsランタイムクラスは、 XAMLパーサーからカメラ機能まで、あらゆる機能へのアクセスを提供するSDK群です。これらのSDKは、ネイティブC/C++ライブラリ(アンマネージド)として実装されています。
API のコンポーネント (クラスやその他のメンバー) の命名規則は、キャメルケース(特にパスカルケース) を使用する .NET の命名規則に大きく影響を受けています。Microsoft は、特に指定がない場合は、これらの規則に従うことを推奨します。
これらの慣習は、JavaScriptなどの一部の言語では異なる方法で表現されます。JavaScriptは、これらの慣習を独自の慣習に変換し、またその逆も行います。これは、プログラミング言語に関係なく、ネイティブで一貫性のあるエクスペリエンスを提供するためです。
Windows Runtime はさまざまな言語に対応するように設計されているため、すべての言語に対応できるように、基本的なデータ型にはいくつかの制限があります。プログラマは、パブリック アクセス (メソッド パラメータ、メソッドの戻り値、プロパティなど) でこれらの型を使用する場合の動作に注意する必要があります。[ 31 ]
Number最大53ビットの精度しか表現できません。nullためです。JavaScriptからWinRTに渡す場合も同様の結果になります。nullundefined+=演算子を使用してイベントを購読します。addEventListener関数またはon<EventName>プロパティを設定することでイベントを購読できます。<Verb>[<Noun>]Async。完全なランタイムライブラリでは、50 ミリ秒以上かかる可能性のあるすべてのメソッドは、非同期メソッドとしてのみ実装されます。Windows Phone 8.1 は、 Windows Phone Runtimeと呼ばれる Windows Runtime のバージョンを使用しています。これにより、C# および VB.NET でのアプリケーション開発、および C++/CX での Windows Runtime コンポーネントの開発が可能になります。[ 32 ] WP8 は限定的なサポートしか提供しませんでしたが、このプラットフォームは最終的にWindows Phone 8.1でWindows 8.1と統合されました。
Windows Phone 8 は、Windows Phone Runtimeを介して Windows Runtime コンポーネントを開発および使用するための限定的なサポートを提供しています。Windows 8 のコアオペレーティングシステム機能を処理する Windows Runtime API の多くは、Windows Phone 8 に移植されています。 [ 33 ]ゲーム開発業界からの要望により、C++/CX および DirectX を使用したネイティブゲームの開発のサポートが追加されました。
しかし、Windows Phone XAMLフレームワークは、下位互換性のために、Windows Phone 7と同じMicrosoft Silverlightフレームワークに基づいています。したがって、 2016年現在C++/CX では XAML 開発は不可能です。また、Windows Phone 8 では HTML5 または WinJS を使用した開発はサポートされていません。
Windows Phone 8.1 における Windows Runtime のサポートは、Windows 8.1 と統合されます。今回のリリースでは、WinRT XAMLのサポート、C++/CXおよびHTML5 - JavaScriptの言語バインディングなど、完全な Windows Runtime API がプラットフォームに提供されます。また、 Windows Phone 8.1 と Windows 8.1 間でアプリがコードを共有できるようにする「ユニバーサル アプリ」というプロジェクト タイプも追加されています。
Windows Phone 8のSilverlightフレームワークがアップデートされました。これにより、Windowsランタイムの新機能の一部を活用できるようになります。
Windows Phone Runtimeは、以前はSilverlight XAPを使用していましたが、Windows 8のAppXパッケージ形式を使用するようになりました。
ドメインに参加していない Windows 8 Enterprise コンピューター、または Windows® 8 Pro コンピューターでサイドローディングを有効にするには、サイドローディング用プロダクト アクティベーション キーを使用する必要があります。Windows® RT デバイスでサイドローディングを有効にするには、サイドローディング用プロダクト アクティベーション キーを使用する必要があります。サイドローディング用プロダクト アクティベーション キーの詳細については、Microsoft ボリューム ライセンスを参照してください。