Windowsランタイム

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Windows Runtimeから転送)
ナビゲーションに移動 検索に移動

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

WinRTはx86/x64/ARM/ARM64をネイティブサポートし、またサンドボックス環境内で動作することで従来のデスクトップアプリケーションよりもセキュリティや安定性を高めることができる[注釈 1]

概要[編集]

WinRTはC++言語によって実装された、オブジェクト指向設計にもとづく近代的なAPIである(なお前身となる旧来のWin32 APIは、C言語のインターフェイスを持つAPIとして設計され、C/C++両方から利用することができた)。また、COMに基づいたネイティブ(アンマネージ)APIであり、COMのように複数の言語から利用することができる。

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

新しいC++/CX (Component Extensions) 言語はC++/CLIの文法をいくつか借用しており、C++によるクラシックなCOMプログラミングよりも少ないグルーコードでWinRTコンポーネントの作成や利用が可能である。また、C++/CLIと比較して、純粋C++型(class/struct)とWinRT型(ref class/ref struct/value class/value struct)が混在する場合において課される制約がほとんどない[注釈 2]。ただし、C++/CXは常用するべきものではなく、純粋なC++言語で書かれたコードをWinRTアプリケーションで再利用するためにラップする場合など、境界面においてのみ使用することが推奨されている。例えばC++/CXによるコンポーネント拡張はABI境界でのみ使用されることが勧められている[9]。通常の(COM準拠の規約つきの)C++も、新しいテンプレートライブラリであるWindows Runtime C++ Template Library (WRL) で補助することでWinRTコンポーネントをプログラミングする際に利用可能である[10]。目的としては、WRLはCOM用にATLが提供しているものに似ている[11]が、いくつかの機能が省略されている[12]。なお、のちに標準C++17をベースとした言語プロジェクションとしてC++/WinRTが開発され、C++/CXおよびWRLの代替として推奨されるようになった[3]

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

歴史[編集]

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は共存可能である[13]

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

技術[編集]

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

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

サービス[編集]

メタデータ[編集]

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

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

型システム[編集]

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

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

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

WinRT コンポーネント[編集]

Classes that are compiled to target the WinRT are called WinRT components. They are classes that can be written in any supported language and for any supported platform. The key is the metadata. This metadata makes it possible to interface with the component from any other WinRT language. The runtime requires WinRT components that are built with .NET Framework to use the defined interface types or .NET type interfaces, which automatically map to the first named. Inheritance is as yet not supported in managed WinRT components, except for XAML classes.[25]

プログラミングインターフェイス[編集]

Programs and libraries targeted for the WinRT runtime can be created and consumed from a number of platforms and programming languages. Notably C/C++ (either with language extensions offering first-class support for WinRT concepts, or with a lower-level template library allowing to write code in standard C++), .NET (C# and VB.NET) and JavaScript. This is made possible by the metadata.

In WinRT terminology, a language binding is referred to as a language projection.

C++ (C++/WinRT, C++/CX, WRL)[編集]

Native C++ is a first-class citizen of the WinRT-platform. To use WinRT from C++ two supported options are available: WRL—an ATL-style template library—and C++/CX (C++ with Component Extensions) which resembles C++/CLI.[26] Because of the internal consumption requirements at Microsoft, WRL is exception-free, meaning its return-value discipline is HRESULT-based just like that of COM.[27] C++/CX on the other hand wraps-up calls to WinRT with code that does error checking and throws exceptions as appropriate.[28]

C++/CX has a number of extensions that enable integration with the platform and its type system. The syntax resembles the one of C++/CLI although it produces native code and metadata that integrates with the runtime. For example WinRT objects may be allocated with ref new, which is the counterpart of gcnew from C++/CLI. The hat operator (^) retains its meaning, however in the case where both the caller and callee are written in C++ and living in the same process, a hat reference is simply a pointer to a vptr to a vtable.[28]

An addition to C++/CX relative to traditional C++ COM programming are partial classes, again inspired from .NET. These allow for instance XAML code to be translated into C++ code by tools and then combined with human-written code to produce the complete class while allowing clean separation of the machine-generated and human-edited parts of a class implementation into different files.

WinRT is a native platform and supports any native C++ code. A C++ developer can reuse existing native C/C++ libraries with the only need to use the language extensions when writing code that is interfacing with the runtime.

.NET[編集]

The .NET Framework and the Common Language Runtime (CLR) is integrated into the WinRT as a subplatform. It also has influenced and set the standards for the ecosystem through the metadata format and libraries. The CLR provides services like JIT-compilation code and garbage collection.

WinRT supports XAML-based .NET Metro-style applications which are primarily written in C# and VB.NET. Although not yet officially supported, programs can also be written in other .NET languages.

制限事項

Classes defined in WinRT components that are built in managed .NET languages must be declared as sealed to not be able to be derived from as a limitation. However, non-sealed WinRT classes defined elsewhere can be inherited from in .NET, their virtual methods overriden, and so on (but the inherited managed class must still be sealed).

Members that interfaces with other language must have a signature with WinRT types or a managed type that is convertible to these.[29]

JavaScript[編集]

Microsoft initially announced that HTML5 and JavaScript would be integrated as part of the development experience for Windows 8. The "Chakra" JavaScript engine which was developed for Internet Explorer 9 integrates with WinRT. That makes JavaScript a first-class citizen in the WinRT ecosystem.

The JavaScript environment does some tricks under the hood. It adapts WinRT features to follow the JavaScript naming conventions to make the developer get the same experience as on the Web-platform. Namespaces are mapped to JavaScript objects and some special members are also added in some cases to make the developer experience similar to any web scenario.

Metro interfaces can be built with HTML5 and CSS and JavaScript in code-behind.

The current version is JavaScript 5.

API[編集]

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

Windows classes[編集]

The Windows classes are native C/C++ libraries (unmanaged) that are exposed by the WinRT. They provide access to all functionality from XAML parser to the camera function.

Naming conventions[編集]

The naming conventions for the components (classes and other members) in the API are heavily influenced by the .NET naming conventions which uses camel case. Microsoft recommends users to follow these rules in case where no others are given.

These conventions are projected differently in some languages, like JavaScript, which converts it to its conventions and the other way around. This is to give a native and consistent experience regardless of the programming language.

脚注[編集]

注釈[編集]

  1. ^ Windows 8.xの時点ではx86/x64/ARMのみだったが、Windows 10のユニバーサルWindowsプラットフォームでは64ビットARMすなわちARM64のサポートも追加された[4]
  2. ^ C++/CLIにおいては、ガベージコレクションにかかわることから、ネイティブ型にマネージ型のインスタンスを含める場合、gcrootクラステンプレートによるラップが必要になる[8]などの制約がある。

出典[編集]

  1. ^ Abel Avram (2011年9月21日). “Design Details of the Windows Runtime”. InfoQ. 2011年9月27日閲覧。
  2. ^ Brian Klug & Ryan Smith (2011年9月13日). “Microsoft BUILD: Windows 8, A Pre-Beta Preview”. AnandTech. 2011年9月27日閲覧。
  3. ^ a b Introduction to C++/WinRT - UWP applications | Microsoft Docs
  4. ^ Official support for Windows 10 on ARM development - Windows Developer Blog
  5. ^ http://tirania.org/blog/archive/2011/Sep-15.html
  6. ^ COM 相互運用性 - 第 1 部 : C# クライアント チュートリアル (C#), Internet Archive
  7. ^ http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/d510d916-a090-412c-a17f-e4421ad9a137/
  8. ^ How to: Declare Handles in Native Types | Microsoft Docs
  9. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T
  10. ^ http://www.codeproject.com/KB/cpp/WinRTVisualCppIntro.aspx
  11. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T#c634517976543836549
  12. ^ Windows Runtime C++ Template Library (WRL) | Microsoft Docs
  13. ^ Visual Studio 2013 Compatibility | Microsoft Docs
  14. ^ Develop apps for the Universal Windows Platform (UWP) - Visual Studio 2015 | Microsoft Docs
  15. ^ WinRT and .NET in Windows 8 (Paragraph 5)”. 2012年8月29日時点のオリジナルよりアーカイブ。2011年10月16日閲覧。
  16. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T
  17. ^ http://www.ciprianjichici.ro/blog/post/NET-Gets-a-New-Lease-of-Life.aspx
  18. ^ Template ref classes (C++/CX) | Microsoft Docs
  19. ^ Standard C++ data types and C++/WinRT - UWP applications | Microsoft Docs
  20. ^ Interop between C++/WinRT and the ABI - UWP applications | Microsoft Docs
  21. ^ Windows Runtime components with C# and Visual Basic - UWP applications | Microsoft Docs
  22. ^ 第2回 Windowsランタイム・コンポーネントの作成とmrubyのコンパイル:連載:Windowsランタイム・コンポーネントによるコードの再利用(1/3 ページ) - @IT
  23. ^ Collections (C++/CX) | Microsoft Docs
  24. ^ HSTRING (Hstring.h) - Win32 apps | Microsoft Docs
  25. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-531T
  26. ^ http://blogs.msdn.com/b/vcblog/archive/2011/10/20/10228473.aspx
  27. ^ http://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-3-The-CCX-Episode-with-Marian-Luparu
  28. ^ a b Under the covers with C++ for Metro style apps with Deon Brewis at //BUILD
  29. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-531T

関連項目[編集]

外部リンク[編集]