WinUI と WinRT: WebAssembly のおかげで公式の最新 Windows API がユニバーサルになりました

Table of Contents

WinUI と WinRT: WebAssembly のおかげで公式の最新 Windows API がユニバーサルになりました

Microsoft は最近の Ignite カンファレンスで、デスクトップ開発者にとって WinUI が最善の道であると宣伝し、Windows 7 または Web 展開のオプションとしてサードパーティの Uno プラットフォームを紹介しました。

「WinUI 3.0は、WindowsにおけるネイティブUX開発の未来です」と、マイクロソフトのプリンシパルプログラムマネージャー、ジェームズ・クラーク氏は今月初めのイベントで述べた。開発者たちは、これまでにもこのような言葉を耳にしてきたはずだ。

とはいえ、WinUI は実際には新しいものではなく、Windows 8 用に考案された「モダン」プラットフォームをベースにした Windows 10 で導入されたユニバーサル Windows プラットフォーム (UWP) の次のフェーズです。

WinUIという名称は、もともとユーザーインターフェースを記述するためのMicrosoftのXML言語であるXAMLでサポートされるコントロールライブラリを表すために考案されました。現在アルファプレビュー版となっているWinUI 3.0では、Windows 10のUIスタック全体を表すために使用されています。

古いWin32 APIがまだ存在し、Win32アプリケーションも引き続き実行できるため、多少の混乱はありますが、WinUIをネイティブWindows UIスタックとして捉えることが私たちの意図です。開発者がUWPアプリケーションとデスクトップアプリケーションのどちらかを選択しなければならないという従来の考え方は過去のものとなり、Win32アプリケーションはUWPまたはWinUIで使用されるWinRT APIにフルアクセスできるようになり、XAML Islandsと呼ばれるテクノロジを介してWinUIコントロールにもアクセスできるようになりました。また、WinUI 3.0アプリケーションはデスクトップアプリケーションのように動作します。WinUI 3.0はWindows 10 1703以降で動作します。

Windows開発プラットフォームの進化

Windows開発プラットフォームの進化。WinUIとWinRT APIが主流となり、Win32はレガシーオプションとして継続される。

このアプローチのさらなる意味合いは、MicrosoftがWin32 APIに関して最小限の作業しか行わないという点です。Windows FormsやWPF(Windows Presentation Foundation)といった古いフレームワークは、基本的にそのまま残されます。主な取り組みは、これらのフレームワークを.NETの最新かつオープンソース版である.NET Core上で動作させ、開発者がWinUI機能を用いてアプリケーションを拡張できるようにすることです。

WinUIはC++で記述されており、アプリケーションはC++やJavaScript(MicrosoftはJavaScript開発者にReact Nativeへの移行を推奨しています)などの言語、そして.NET言語でコーディングできます。.NET向けのクロスプラットフォームGUIフレームワークであるXamarin Formsは、Windows上でUWPアプリを構築します。

WinRTはすべての点で優れているわけではない

WinRTを開発し、Win32開発者を時間的に凍結するというMicrosoftの歴史的な決断は、大きな代償を伴いました。UWPとWinRTの普及が制限されてきた理由はいくつかあります。その一つは互換性です。

Windows 7はまだたくさん残っています。最新のStatcounterの統計によると、世界中のWindowsユーザーのうち、Windows 10を使用しているのはわずか63%で、Windows 7を使用しているのは28%です。Windowsで幅広いリーチを目指す開発者はWinRTを利用できませんでしたが、対象プラットフォームが管理されている基幹業務アプリケーションでは、これはそれほど問題ではありません。

もう一つの問題は、WinRTが明確に優れているわけではないということです。放射状グラフィックを描画するRadialGradientBrushは長年WPFで使用されていましたが、WinUIではようやく導入されました。情報密度も問題となっており、タッチ操作に適した最新のUWPやWinUIコントロールでは、より多くの空白領域が確保されています。さらに、MicrosoftはWindowsフォームに見られるような開発の容易さを、手軽なビジネスアプリケーション向けに再現できていません。

しかし、振り子は揺れ動いています。WinRT側の新機能により、Win32アプリはいくつかの点で時代遅れに見えるようになり、Windows 7は徐々に衰退しつつあり、2020年1月14日には多くのユーザーに対するサポートが終了します。

しかし、XAMLとWPF、あるいは10年前には未来の標準になるかもしれないと思われていたWPFのクロスプラットフォーム版であるSilverlightを導入した.NET開発者にとっては、依然として混乱を招く状況です。厄介な点の一つは、WinUI XAMLがWPF XAMLと異なり、さらにXamarin Forms XAMLも異なるため、これら3つを簡単に移植できないことです。

宇野のボスと話す

Igniteで、The RegisterはUno PlatformのCTO、ジェローム・ラバン氏にインタビューを行いました。フランス企業nventiveが開発したこのサードパーティ製GUIは、Microsoftが「ユニバーサル」Windows Platformで実現できなかったことを実現しています。Windows、iOS、Android、そしてWebのクロスプラットフォーム対応を実現しています。

ラバン氏は多くのWindows開発者と同様に、Windows Phoneが衰退する一方でiOSとAndroidが成長しているのを見て、ある問題に直面しました。「当時、開発者とデザイナーは40人ほどいましたが、どうすればいいのでしょうか? iOSとAndroidに興味を持つ人は多く、XAMLとC#の訓練を受けた開発者もいます」と彼は言います。

ラバン氏は、スケーリング機能を備えたUWP XAMLは気に入っているものの、Windows専用であることが気に入らないと述べた。そこで彼は、「iOSとAndroid上でUWP XAMLの動作をエミュレートする」作業に着手した。「私たちはXamarinをベースに構築しています。Xamarin Formsではなく、最も純粋なXamarinです。」

ラバン氏にとって大きな出来事は、マイクロソフトがWinUIをオープンソース化したことでした。「つまり、C++からC#に移植でき、Windows上のWinUIと全く同じ動作を実現できるということです」と彼は言います。

ジェローム・ラバン氏、Uno プラットフォーム CTO

Ignite の公式 WinUI スタンドに立つ Uno プラットフォーム CTO のジェローム・ラバン氏

Xamarin自体は、.NET Coreよりも古いオープンソースの.NET実装であるMonoを部分的にベースにしています。2年前、MonoチームはWebAssembly向けのMonoバージョンであるMono Wasmの開発を開始し、Uno開発者たちはそれに注目しました。「数ヶ月の間にMonoにインタープリターが追加されました。速度は速くありませんでしたが、動作はLinuxやAndroidと全く同じでした。私たちは、大規模なC#コードベースがあるのだから、WebAssembly向けにMonoに載せたらどうだろうと考えました。」

その結果、Uno Platformはブラウザ上で動作するようになり、Windows 7、Mac、Linuxにも対応しました。また、ChromiumベースのElectronなどを用いた組み込みブラウザ技術を介して、クロスプラットフォームのデスクトップアプリケーションを開発することも可能になります。ブラウザ上ではUno for WebAssemblyはブラウザの権限のみを持ちますが、組み込み時には追加のネイティブAPIを呼び出すことができます。

ラバン氏は、このシステムは現状でも問題なく動作していると述べた。「Web Assembly用のMono、LLVM、スクリプト、Web Assembly標準の改善など、全体の効率性を高めるには多くの改善が必要です。しかし、現状は非常に良好な状態です。実際に動作しています。特定のシナリオでは効率が十分ではない場合もありますが、イントラネットや基幹業務アプリケーションでは、現状のままで完璧です。Silverlightアプリケーションでできることはすべて、Web Assemblyでも実現できます。」

Igniteでは、MicrosoftがUnoに公式サポートを提供しました。WinUIセッションでは、Windows 7サポートへの道筋としてUnoがスライドに登場しました。さらに、ブラウザでXamarin Formsを使えるようにするレンダラーによって、Xamarin Formsの課題も解決しています。

Uno は Apache 2.0 ライセンスに基づくオープンソースです。

.NET Coreの不満点の一つは、クロスプラットフォームのGUIライブラリがないことです。MicrosoftはWinUIのクロスプラットフォーム化を検討しており、Igniteでこのテーマに関する意見を集めていました。このような動きはWinUIへの関心を高めることは間違いありませんが、Microsoftの既に混乱している機能群にさらなる選択肢を追加することで、事態を混乱させる可能性も否定できません。

マイクロソフトは、Windows 10を実行しているデバイスが9億台あると主張しています。これはかなり大きな市場ですが、ゲーム業界を除けば、ほとんどの開発者にとっては主にビジネス市場です。Windowsをターゲットとする.NET開発者は難しい選択を迫られてきましたが、今となっては(手遅れですが)、WinUIは多くのシナリオで実行可能なソリューションになりそうです。®

Discover More