クロスプラットフォームなGUIフレームワーク「Eto.Forms」の紹介

この記事は、C# Advent Calendarの最終日(12月25日)の項目です。なお前日は smbkrysk14 さんの「Material Design In XAML ToolkitでWPFアプリにモダンなUIを!」でした。C#アドベントカレンダーで2日連続でクライアントGUI関連というのは、ちょっとおもしろいなあと思ったり。

Eto.Forms記事一覧

導入

Webアプリケーションなども増えましたが、クライアントアプリケーションが必要な場面もあります。その際、可能ならば多くのOSに対応できるといい場合もあります。企業ならば、モデルは共通化しておき、GUIは必要なOS向けそれぞれに開発することもできるでしょうが、個人などには難しい場合もあります。そこで使われるのが共通プラットフォームです。

今回は、クロスプラットフォームGUIフレームワークの1つである「Eto.Forms」について、導入部分を扱いたいと思います。なお、今後Eto.Formsの自作サンプルをいくつか紹介していきたいと思います。

github.com

日本語の情報は、id:ailen0adaさんのスライドだけかも。

ちなみに、これらの発表時のEto.Formsのバージョンは1.3~2.0.7です。その後リリースされたバージョンは、色々追加のあった2.1と2.2、アナウンスが地味な2.3の合計3回です。

概略

公式冒頭のDescriptionを訳しておきます。

このフレームワーク(訳注:Eto Forms)により、複数のプラットフォーム上で動く、ネイティブなGUI要素を使うアプリケーションの開発が、簡単なAPIにより可能となります。単一のUIコードベースで、全ての対応プラットフォームでネイティブアプリケーションとして動作する、ということです。

さらに、共通UI要素をラップして組み込むことでプラットフォームそれぞれの能力を引き出すこともできますし、プラットフォームごとに高度なGUI要素を作り出すことさえ可能です。

このフレームワークの現時点でのサポート対象は、デスクトップではWindows Forms, WPF, MonoMac, GTK#です。モバイル対応も進めていますが、まだ不完全です。

このフレームワークは.NETとして自然なコードになるように作られています。例として、単純なHello, Worldは次のようになります。(以下略)

なお、この後に記載がありますが、オーストラリアの会計ソフトManagerがEto.Formsを使っています。

www.manager.io

次に、個人的な印象(特徴)を挙げます。

  • テキストボックスやコンボボックスなどを使った、「伝統的」なアプリケーションには、そこそこ使える(凝ったGUI表現はややこしいか難しい。また細かいバグや未実装項目もあるので注意)。
  • コード用言語がC#など.NET系なので、UI以外はXamarinとの共通化が可能。
  • GUI定義はソースコード以外にXAML, JSONも利用可能。XAMLはXamarinのSystem.Xamlを元にしたPortable Xamlを使うため、Xamarinとの親和性は高いかも。
  • NuGetで導入でき、APIがドキュメントされているので、(同じ.NET用クロスプラットフォームGUIフレームワークの)mono/xwtよりは取り掛かりが容易。
  • GUI要素がネイティブなので、例えばRaspberry Pi上でも動作が比較的軽い(個人的には、初代Piはともかく、Pi2以降ならテキストボックスで実用的に日本語入力できると感じました)。

なお、2.2のリリース以降は地味な変更が多いものの、今でも着実に開発が続いています。

Hello, Worldまで

元ネタは公式です。

Quick Start · picoe/Eto Wiki · GitHub

なお、開発環境にはVisual Studio 2015 Communityを使ってますが、2013でも似たようなものです。

Eto.Formsアドインを検索

Visual Studioの「ツール(T)」→「拡張機能と更新プログラム(U)…」を選択します。

f:id:mokake:20161225013748p:plain

ダイアログの左側で「オンライン」の「Visual Studioギャラリー」を選択します。

f:id:mokake:20161225013807p:plain

ダイアログ右上の検索欄に「Eto.Forms」と入力します。自動的に検索が行われ、Eto.Formsのアドインが表示されるはずです。

f:id:mokake:20161225014459p:plain

Eto.Formsアドインをインストール

「ダウンロード(D)」ボタンをクリックしてダウンロードを始めます。

f:id:mokake:20161225014527p:plain

インストール確認画面が出るので、「インストール(I)」ボタンをクリックします。

f:id:mokake:20161225014543p:plain

インストールが完了すると、Visual Studioの再起動が求められるので、「今すぐ再起動®」ボタンをクリックします。

f:id:mokake:20161225014600p:plain

Hello Worldプロジェクトの作成

Visual Studioを再起動してプロジェクトを新規作成します。テンプレートは「Visual C#」の「Eto.Forms」から「Eto.Forms Application」を選びます。プロジェクト名、ソリューション名は適当に。初期設定は「EtoApp1」です。

f:id:mokake:20161225014616p:plain

プロジェクト設定として、3つの項目が表示されます。いずれもプロジェクトの性質に応じて設定すればいいでしょう。ここでは、下記の設定(「Combined Windows & Linux assembly, separate mac」「Portable Class Library」「Code」)を前提としておきます。

f:id:mokake:20161225014631p:plain

これでテンプレートに基づくプロジェクトのできあがりです。

f:id:mokake:20161225014645p:plain

Hello Worldプロジェクトの実行

新規プロジェクトができたら、そのままビルドします。テンプレートにコードが入っているので、成功するはずです。実行すると、「Hello World!」と表示されます。

f:id:mokake:20161225014702p:plain

ツールバー(またはFileメニュー)の「Click Me!」を選ぶと、メッセージダイアログが表示されます。

f:id:mokake:20161225014719p:plain

Helpメニューの「About…」を選ぶと、さっきとは別のメッセージ(いわゆる「このプログラムについて」)が表示されます。

f:id:mokake:20161225014738p:plain

Fileメニューには「Preferences…」という項目もありますが、反応はありません(実装がないので)。一方「Quit」は、ショートカット(Ctrl+Q)も含めて動作します。

f:id:mokake:20161225014753p:plain

Linuxで動かす

次はクロスプラットフォーム動作の確認です。ただしMacintoshはないので、Linuxのみで。今回はLinux Mint 18 xfceUbuntu 16.04 LTSベース)を使います。

Mint18は初期状態でMonoが予め入っているので、特に事前手順はありません。

Eto.Forms側には特に記載はありませんが、現在のEtoは.NET4.5が主なターゲットなので、Monoは3.0以上が必須です。.NET4.5もMono3.0も2012年10月リリースなので、2012年以前のディストリビューションでは注意が必要です(例えばUbuntu12.04および派生版は2017年までサポートが続くので、まだ使っている人もいるかも。例えばLinux Beanの12.04版とか)。

使うファイルの特定

Visual StudioでReleaseビルドを行い、プロジェクトフォルダ内を見てみます。

プロジェクト名(ここでは「EtoApp1」)と、それに「.Desktop」をつけたフォルダがそれぞれ存在することが分かります。なお、packagesフォルダには関連DLLなどが収められています。全てなので、かなりの容量になります(今回は30MiB強)。

f:id:mokake:20161225014813p:plain

Visual Studio側で構成を見ると分かるのですが、実際の実行部分は「.Desktop」がついたフォルダです。

f:id:mokake:20161225014829p:plain

実行関連ファイルは「bin」フォルダ内にあります。

f:id:mokake:20161225014855p:plain

Linux上で動かす場合に必要なのは、今回の例では次のファイルです。

  • EtoApp1.Desktop.exe(アプリケーション実行ファイル)
  • EtoApp1.dll(EtpApp1プロジェクトをビルドしたもの)
  • Eto.dll(Eto.Forms共通ライブラリ。全てのプラットフォームで必須)
  • Eto.Gtk2.dll(GTK+2.xと連携させるライブラリ。GTK+2上では必須、GTK+3もあるならなしでもOK)
  • Eto.Gtk3.dll(GTK+3.xと連携させるライブラリ。GTK+3上では必須)

他のDLLは、ファイル名から分かるようにプラットフォームごとのものです。

ファイルのコピーと実行

さて、先ほどのファイルをLinux側にコピーします。単純なファイルコピーなので、手段は何らかのファイル共有でもUSBメモリでも構いません。

f:id:mokake:20161225014935p:plain

実行ファイル「EtoApp1.Desktop.exe」をダブルクリックか、または右クリックから「Mono Runtimeで開く」を選び、起動します。コマンドラインから「mono EtoApp1.Desktop.exe」でもOKです(うまく起動しない場合、とりあえず例外メッセージが出るのでコマンドラインの方がいい場合もあるかも)。

f:id:mokake:20161225014954p:plain

単純コピーで、Windowsと同様にアプリケーションが動きます。

f:id:mokake:20161225015010p:plain

ボタンなど、細かい部分はプラットフォームの設定に準じています。

Raspberry Piで動かす

Raspbery Pi2のRaspbian上でも動かしてみます。

Monoがなければ、事前にインストールしておきます。

その上で、Mintで動かすのと同じファイルをPiに転送し、実行ファイルをダブルクリック。

f:id:mokake:20161225114337p:plain

もちろんダイアログも出せますし、メニューも動作します。

f:id:mokake:20161225114409p:plain

f:id:mokake:20161225114423p:plain

DLL読み込みの優先順位(の一部)

「Eto.Gtk2.dll」と「Eto.Gtk3.dll」の両方があり、Linux側でも両方使える場合は、GTK+3が優先的に使用されるようです。「Eto.Gtk3.dll」を削除(またはファイル名変更)すると、自動的にGTK+2で動作します。

Windowsでも、WPFが優先して用いられるものの、「Eto.Wpf.dll」を削除か改名すると、Windows Formsが使われます(ただし、作者はWinFormsを将来的には削除することを検討しています)。

まとめ

  • Eto.Formsを、Visual Studioにインストールし、最初のプロジェクトの実行までの手順を示しました。
  • Windows上で作ったアプリケーションを、単純コピーでLinux MintやRaspbianに展開、実行できることを示しました。
  • Eto.Formsは、C#やF#向けのデスクトップOSクロスプラットフォーム環境として、考慮してみてもいいのではと思います。
  • 今後もEto.Formsのサンプル出します。