クロスプラットフォームアプリケーション開発ツール Uno Platform を触ってみた

2021.07.10

いわさです。

Microsoftのドキュメントやブログをよく見るのですが、よく"Uno Platform" というワードを目にすることがありました。

Xamarinのようなクロスプラットフォーム開発ツールという噂は聞いていたのですが、誰がどういうシーンで活用できるのかまったくわかっていなかったので、触り始めることにしました。

Uno Platform とは

Uno Platformは、シングルソースで各プラットフォーム(Windows, WebAssembly, iOS, macOS, Android, Linux)のアプリケーションを実装出来る、UIプラットフォームです。
利用者は、C#とXAML(UWPベース)を使って共通コードを実装することが出来ます。

Xamarinに非常によく似ていますが、WebAssemblyやWPFなど対象が広がっていることと、独自XAMLではなくUWPベースのXAMLで記述できる点が特徴でしょうか。

GitHubリポジトリのContribursにXamarinやMicrosoftが含まれているので、その関係でMSDocなどでも紹介されているのかもしれませんね。今後の連携にも期待したいと思います。

Uno Platform は Visual Studio の拡張機能&テンプレートとして動作します。
対象のVisual Studio バージョンは 2019 とされています。

次期Visual Studio(2022)に向けても準備されているようですね。

試してみた

Visual Studio 2019 での、セットアップ・プロジェクト作成・各プラットフォームでの起動を行ってみました。

まずはVisual Studio 拡張機能をインストールします。
対象は Uno Platform Solution Templates です。

インストール後、Visual Studio を再起動します。

プロジェクト新規作成時に、Uno Platformカテゴリが追加されています。
追加されたプロジェクトテンプレートを使ってください。

なお、Android SDKや UWP用の Windows SDKが不足している場合はこのタイミングで自動でセットアップされます。

ソリューションの構成としては Shared が共通コードで、残りがプラットフォーム毎のプロジェクトとなります。
仕組みとしては、各プロジェクトのエントリポイントで共通コードで定義したアプリケーションクラスをロードしている形です。
このあたりの仕組みはXamarin.Formsの実装と似ていますね。

冒頭でUWPベースのXAML実装とお伝えしましたが、全てのコントロールが使えるわけではありません。
使えるもの使えないものがあって、公式ドキュメントにまとめられています。

プロジェクト新規作成直後は "Hello, world !" を表示する画面が作成されています。
早速各プラットフォームで実行していってみたいと思います。

UWP

UWPはそのままネイティブに動いています。

WebAssembly

WebAssembly は .NET Runtime の Wasm を使って実現しています。
ASP.NET と同様に IIS Expressでローカル実行出来ます。

WPF

WPFはhostsのプロジェクトが実行ターゲットになります。
WPFプロジェクトは参照されている構成です。

iOS, Android

Xamarinを使っています。
今回はWindows機で試しましたが、iOSの場合は macOSと通信設定することでWindows環境でのビルドと実行が可能です。
別途設定が必要なのとVisual Studio for Mac でも Uno Platform は動作させることが出来るので、今回は割愛します。

インテリセンスが効かない問題の対処

当初、XAMLエディタ上でインテリセンスが使えませんでした。

公式ドキュメント上にも対応策の記載があります。
エディター上のプロジェクトはUWPを選ぶ必要があります。

まとめ

Uno Platform は Xamarin.Forms に似たクロスプラットフォーム開発ツールです。
C#やXAMLに慣れていて、Xamarinを触ったことがあればすぐ使い始めることが出来ると思います。

しかし、HelloWorld程度であれば問題ないのですが、経験上プロダクトコードに近くなればなるほどつらいところが見えてくるような気がします。
もう少し使ってみて、どのあたりが大変か。どういう対策を取るのが良いか、などもアウトプットしていきたいと思います。

参考情報