クロスプラットフォームなGUIフレームワーク「Eto.Forms」の紹介
この記事は、C# Advent Calendarの最終日(12月25日)の項目です。なお前日は smbkrysk14 さんの「Material Design In XAML ToolkitでWPFアプリにモダンなUIを!」でした。C#のアドベントカレンダーで2日連続でクライアントGUI関連というのは、ちょっとおもしろいなあと思ったり。
Eto.Forms記事一覧
- ボタンと1行テキストボックス
- 複数行テキストボックス
- 画像表示
- アプリケーションのアイコン設定
- XAMLとデータバインド
- XAMLでCommandバインド
- Webブラウザコントロール
- シンプルな設定ダイアログ
- やや複雑な設定ダイアログ
- リストボックス
- リストボックス(XAML)
- ツリー型の表(TreeGridView)
- 展開型パネル(Expander)
- Expander(XAML)
- gettext(C#汎用ですがサンプルはEto)
- メニュー翻訳のためのTips
導入
Webアプリケーションなども増えましたが、クライアントアプリケーションが必要な場面もあります。その際、可能ならば多くのOSに対応できるといい場合もあります。企業ならば、モデルは共通化しておき、GUIは必要なOS向けそれぞれに開発することもできるでしょうが、個人などには難しい場合もあります。そこで使われるのが共通プラットフォームです。
今回は、クロスプラットフォームGUIフレームワークの1つである「Eto.Forms」について、導入部分を扱いたいと思います。なお、今後Eto.Formsの自作サンプルをいくつか紹介していきたいと思います。
日本語の情報は、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を使っています。
次に、個人的な印象(特徴)を挙げます。
- テキストボックスやコンボボックスなどを使った、「伝統的」なアプリケーションには、そこそこ使える(凝った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)…」を選択します。
ダイアログの左側で「オンライン」の「Visual Studioギャラリー」を選択します。
ダイアログ右上の検索欄に「Eto.Forms」と入力します。自動的に検索が行われ、Eto.Formsのアドインが表示されるはずです。
Eto.Formsアドインをインストール
「ダウンロード(D)」ボタンをクリックしてダウンロードを始めます。
インストール確認画面が出るので、「インストール(I)」ボタンをクリックします。
インストールが完了すると、Visual Studioの再起動が求められるので、「今すぐ再起動®」ボタンをクリックします。
Hello Worldプロジェクトの作成
Visual Studioを再起動してプロジェクトを新規作成します。テンプレートは「Visual C#」の「Eto.Forms」から「Eto.Forms Application」を選びます。プロジェクト名、ソリューション名は適当に。初期設定は「EtoApp1」です。
プロジェクト設定として、3つの項目が表示されます。いずれもプロジェクトの性質に応じて設定すればいいでしょう。ここでは、下記の設定(「Combined Windows & Linux assembly, separate mac」「Portable Class Library」「Code」)を前提としておきます。
これでテンプレートに基づくプロジェクトのできあがりです。
Hello Worldプロジェクトの実行
新規プロジェクトができたら、そのままビルドします。テンプレートにコードが入っているので、成功するはずです。実行すると、「Hello World!」と表示されます。
ツールバー(またはFileメニュー)の「Click Me!」を選ぶと、メッセージダイアログが表示されます。
Helpメニューの「About…」を選ぶと、さっきとは別のメッセージ(いわゆる「このプログラムについて」)が表示されます。
Fileメニューには「Preferences…」という項目もありますが、反応はありません(実装がないので)。一方「Quit」は、ショートカット(Ctrl+Q)も含めて動作します。
Linuxで動かす
次はクロスプラットフォーム動作の確認です。ただしMacintoshはないので、Linuxのみで。今回はLinux Mint 18 xfce(Ubuntu 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強)。
Visual Studio側で構成を見ると分かるのですが、実際の実行部分は「.Desktop」がついたフォルダです。
実行関連ファイルは「bin」フォルダ内にあります。
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メモリでも構いません。
実行ファイル「EtoApp1.Desktop.exe」をダブルクリックか、または右クリックから「Mono Runtimeで開く」を選び、起動します。コマンドラインから「mono EtoApp1.Desktop.exe」でもOKです(うまく起動しない場合、とりあえず例外メッセージが出るのでコマンドラインの方がいい場合もあるかも)。
単純コピーで、Windowsと同様にアプリケーションが動きます。
ボタンなど、細かい部分はプラットフォームの設定に準じています。
Raspberry Piで動かす
Raspbery Pi2のRaspbian上でも動かしてみます。
Monoがなければ、事前にインストールしておきます。
その上で、Mintで動かすのと同じファイルをPiに転送し、実行ファイルをダブルクリック。
もちろんダイアログも出せますし、メニューも動作します。
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のサンプル出します。