Windows Runtime

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

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

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

概要[編集]

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

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

新しいC++/CX (Component Extensions) 言語はC++/CLIの文法をいくつか借用しており、C++によるクラシックなCOMプログラミングよりも少ないグルーコードでWinRTコンポーネントの作成や利用が可能である。また、C++/CLIと比較して、純粋C++型(class/struct)とWinRT型(ref class/ref struct/value class/value struct)が混在する場合において課される制約がほとんどない(C++/CLIにおいては、ガベージコレクションにかかわることから、ネイティブ型にマネージ型のインスタンスを含める場合、gcrootクラステンプレートによるラップが必要になる[6]などの制約がある)。ただし、C++/CXは常用するべきものではなく、純粋なC++言語で書かれたコードをWinRTアプリケーションで再利用するためにラップする場合など、境界面においてのみ使用することが推奨されている。例えばC++/CXによるコンポーネント拡張はABI境界でのみ使用されることが勧められている[7]。通常の(COM準拠の規約つきの)C++も、新しいテンプレートライブラリであるWindows Runtime C++ Template Library (WRL) で補助することでWinRTコンポーネントをプログラミングする際に利用可能である[8]。目的としては、WRLはCOM用にATLが提供しているものに似ている[9]しかしながらMSDNではWRLの利用ではなくC++/CXによるプログラミングを推奨している[10][疑問点 ]

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

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

技術[編集]

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

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

サービス[編集]

メタデータ[編集]

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

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

型システム[編集]

WinRT has a rich object-oriented class-based type system that is built on the metadata. It supports constructs with corresponding constructs that are found in the .NET framework: classes, methods, properties, delegates and events.

One of the major additions to WinRT relative to COM is the cross-ABI, .NET-style generics. In C++/CX these are declared using the generic keyword with a syntax very similar to that of the template keyword. WinRT classes (ref classes) can also be genericized using C++ templates but only template instantiations can be exported to .winmd metadata (with some name mangling), unlike WinRT generics which preserve their genericity in the metadata. WinRT also provides a library of generic containers that parallel those from the C++ standard library, as well as some back-and-forth conversion functions. The consumption of WinRT collections in .NET languages (e.g. C# and VB) as well as in JavaScript is more transparent than in the case of C++, with automated mappings into their natural equivalents taking place behind the scenes. When authoring a WinRT component in a managed language, some extra, COM-style rules need to be followed, e.g. .NET framework collection types cannot be declared as return types, but only the WinRT interfaces that they implement can be used at the component boundary.

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.[16]

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

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++ (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.[17] 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.[18] C++/CX on the other hand wraps-up calls to WinRT with code that does error checking and throws exceptions as appropriate.[19]

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.[19]

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.[20]

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 comes with an Application Programming Interface (API) in the form of a class library that exposes the features of Windows 8 for the developer, like the Metro interface API. It is accessible and consumable from any supported language.

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. ^ 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. ^ http://tirania.org/blog/archive/2011/Sep-15.html
  4. ^ COM 相互運用性 - 第 1 部 : C# クライアント チュートリアル (C#)
  5. ^ http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/d510d916-a090-412c-a17f-e4421ad9a137/
  6. ^ 方法: ネイティブ型のハンドルを宣言する
  7. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T
  8. ^ http://www.codeproject.com/KB/cpp/WinRTVisualCppIntro.aspx
  9. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T#c634517976543836549
  10. ^ http://msdn.microsoft.com/en-us/library/hh438466%28v=VS.110%29.aspx
  11. ^ 互換性
  12. ^ ユニバーサル Windows プラットフォーム (UWP) 向けアプリの開発
  13. ^ WinRT and .NET in Windows 8 (Paragraph 5)”. 2011年10月16日閲覧。
  14. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T
  15. ^ http://www.ciprianjichici.ro/blog/post/NET-Gets-a-New-Lease-of-Life.aspx
  16. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-531T
  17. ^ http://blogs.msdn.com/b/vcblog/archive/2011/10/20/10228473.aspx
  18. ^ http://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-3-The-CCX-Episode-with-Marian-Luparu
  19. ^ a b Under the covers with C++ for Metro style apps with Deon Brewis at //BUILD
  20. ^ http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-531T

関連項目[編集]

外部リンク[編集]