インサイドXamarin(12)
MonoDevelopにおけるビルド/実行/デバッグと、iOS/Android向けのGUIデザイナー
MonoDevelopでアプリをビルド/実行/デバッグするための機能を解説。iOS/Android向けのGUIデザイナーや、MonoDevelopのカスタムアドインについても紹介する。
前回は、MonoDevelop(Xamarin Studio)の基本的な機能やC#コーディング補助機能についても説明した。今回も引き続きMonoDevelopについて解説する。
MonoDevelopにおけるアプリケーションのビルドと実行
前回説明した通り、MonoDevelopは、必ずしも.NETのプロジェクトだけをターゲットとするものではない。主としてC#を対象としているが、C/C++や他の言語のサポートも可能だ。そして、それらをビルドする方法、および実行する方法は、それぞれ、プロジェクトの種類によって決まってくる。プロジェクトモデルのそれぞれについて、対応するアドインがビルド方法と実行方法を定義する(C#コンソールプロジェクトすら、アドインで定義されている)。
.NETのプロジェクトは、単にMSBuildを呼び出すのが一般的だ。C#のプロジェクトは以前はMonoDevelop独自のビルダーを使用していたし、Xamarin.iOSについては現在でもこれが使われているが、それ以外ではMSBuildに移行している。F#アドインでは、MSBuildが使用されている。ただし、MonoのMSBuild(コマンドラインツールとしてはxbuild
である)は、まだ古いビルドエンジンを使用しているので、例えばC#インラインタスクは機能しない。
MSBuildが利用できない種類のプロジェクトについては、アドインの開発者がビルドのコマンドを実装することになる。例えば、C/C++プロジェクトについては、プロジェクトプロパティの内容に基づいて、gccが呼び出されるようなコマンドがアドインで実装されている。
ビルドされたアプリケーションを実行する方法も、プロジェクトモデルに依存する。.NETのコンソールアプリケーションなら、単純にmonoに実行させる(デバッグ実行については後述する)。ただし、Windowsの場合は、コンソールアプリケーションを実行するランタイムを、「.NET(CLR)」と「mono」から選択できる。ASP.NETアプリケーションなら、monoのWebサーバー「xsp」を起動して、Webアプリケーションのスタートアップページ(index.aspx
など)をブラウザーで開く。NUnitテストライブラリであれば、NUnitのテストランナーが走り、[単体テスト]パッドに結果が表示される。
.NET以外のプロジェクトモデルについては(実のところ.NETでも同様だが)、それを定義したアドインが実行コマンドを定義・実装する必要がある。無ければ実行コマンドは無効になる。
Xamarinのモバイル製品についても、同様のことが言える。実のところ、Xamarin.iOSもXamarin.Androidも、これまでの回で説明した通り、ビルドおよび実行のプロセスはかなり多岐にわたる、複雑なものだ。それぞれにさまざまなビルド処理があり、またアプリケーションのデプロイメントもそれぞれのプラットフォームの流儀に従って行われる。これらは、MSBuildで定義してある部分を除いては、Xamarin Studioの(MonoDevelop本体に無い)アドインが実装している。
アプリケーションのデバッグ
MonoDevelopは、ブレークポイントの設定やステップ実行などを実現するデバッグ機能を備えている。例によって、MonoDevelopは.NET以外のプロジェクトモデルをサポートしていて、MonoDevelopが自らデバッグ対象プログラムを知り尽くしていることはなく、デバッグ機能の実現は主にプロジェクトモデルを提供するアドイン側が責任を負う。デバッグ実行にmonoが使用される場合は、デバッグ機能はmonoランタイム上に実装されているデバッガーが利用される。
一方で、MonoDevelopは、エディターUIなどを含む、いわゆるデバッガーのフロントエンドも提供している。各アドインが実際に実装するのは、デバッガー本体の機能と、デバッガーのフロントエンドの機能を、関連付ける(統合する)コードである。フロントエンドはプロジェクトモデルから独立して定義されている。少々乱暴な例を挙げるなら、どんなプロジェクトであっても、ブレークポイントの追加はF9キーを押すだけでよいはずだ。
MonoDevelopのデバッガー・フロントエンドには、以下のような機能がある。
- ステップ実行(ステップイン、ステップアウト、ステップオーバー)
- ローカル変数の内容表示
- ウォッチ式の定義
- スレッドの切り替え
- ブレークポイント/トレースポイントの設定: ブレークポイントには、条件式、通過回数、アクション(ブレークまたはトレース=アプリケーション出力画面への式の書き出し)が設定可能
- 例外型指定によるブレーク(指定型の例外が発生するとブレーク)
- カーソル下の式のインスタント・ツールチップ: ピン留め表示も可能
- ファンクション・ブレークポイント:
Android.App.Activity.OnCreate
やAndroid.App.Activity.OnCreate(Android.OS.Bundle)
のような書式で指定した型のメソッドの呼び出しでブレーク
デバッガー・フロントエンドから送られたデバッガーの制御命令をどうデバッガーに反映するかは、原理的には実行コマンドと同様、プロジェクトモデル側で定義する。デバッグ対象がmonoランタイム上の.NETのコンソールアプリケーションなら、monoの機能である「soft debugger」のAPIを使用してデバッグ操作が行われる。Webアプリケーションをデバッグするには、Webサーバー「xsp」を起動しているmonoを、リモートでデバッグ制御する必要がある(次の画面は、ASP.NETプロジェクトのデバッグ例)。ちなみにWindows上で動作するMonoDevelopは、アプリケーションをCLR上で実行するが、デバッグについてはICorDebugなどのWindowsネイティブのデバッグAPIを呼び出すようになっている(MonoDevelop.Debugger.Win32.dllを参照)。C/C++のプロジェクトなら、gdbを操作するアドインもmonodevelopのソースに含まれている(デフォルトではビルドされない)。
アプリケーションのビルドや実行と同様、Xamarinモバイル製品のデバッグについても、Xamarin Studioのアドインが、それぞれのプラットフォームの流儀に従って、リモートデバッグ機能を実装している。
GUIデザイナー
Xamarin Studioの大きな特徴の1つは、IDEに統合されたGUIデザイナーである。Xamarin Studio 4.3の時点では、Androidのレイアウト設計をサポートするUIデザイナーと、iOSのStoryboard設計をサポートするUIデザイナーが存在する(XIBについては、XcodeのInterface Builderに編集を完全に委任している)。また、MonoDevelop自体、伝統的にGtk#アプリケーションを設計するために、Gtk#のGUIデザイナーをサポートしてきた(これ自体はXamarinと無関係なので、詳しくは説明しない)。
個別のUIデザイナーについて言及する前に、MonoDevelopが提供する共通の機能について説明しておきたい。MonoDevelopは、過去にGtk# GUIデザイナーを実装するために、UIコンポーネントを選択してドラッグ&ドロップできるツールボックスや、UIオブジェクトのプロパティやコードビハインドへのジャンプなどに対応するイベントを編集できる[プロパティ]パッド、UIオブジェクトの階層構造を表示する[ドキュメント アウトライン]パッドなどを実装してきた。
これはUIデザイナーに固有の話ではないが、それぞれのパッドはメインメニューの[ビュー]から[パッド]を選択して表示有無を切り替えられる。MonoDevelopはIDEによく見られるドッキングビューを採用しており、それぞれのパッドはメインウィンドウから切り離したり、自動的に隠したりすることが可能だ。
Xamarin.iOS UIデザイナー
iOSデザイナーについては、公式サイトにあるイントロダクションおよびウォークスルーガイドを追って試してみると、基本的な使い方が把握できるだろう。[プロパティ]パッドに含まれるプロパティ設定コントロールはXcodeのものと同等だ。イベントの設定については、Xcodeで行うようなアウトレットを自ら設定するような煩雑さはない。
また、iOSデザイナーで特徴的なのは、自ら作成したカスタムコントロールを登録して使用できる点だ。これについても、公式サイトにデザイン可能なカスタムコントロールの作成方法およびそのウォークスルーガイドがあるので、それらを参照されたい。
Xamarin.Android UIデザイナー
Androidデザイナーについても、デザイナーの基本的な使い方とウォークスルーガイドが用意されているので、それらを参考にされたい。また、Androidデザイナーの仕組みについては、Xamarin.Androidの回でコラムとして説明したので、興味のある読者はそれも参考にされたい。
- *3 Androidデザイナーには、iOSデザイナーのようなカスタムコントロールやイベントのサポートなどは含まれていない。実現は可能かもしれないが、Androidフレームワークでビューをロードするやり方について、途中でイベントの登録などを行うカスタムコードを挟み込む余地がないことが、1つの理由として考えられる。「android:onClick」などは、属性として記述できる。
MonoDevelopのカスタムアドイン
MonoDevelopに限らず、一般的にIDEにはアドイン機構(あるいはプラグイン、アドオン、エクステンション)が備わっている。IDEが提供する機能を、IDEのコードベースで全て実装するのは無理があるので、一般的にIDEは、アドイン機構で自身を拡張する余地を残している。MonoDevelop本体にデフォルトで含まれている機能も、大半がアドイン機構によって実現している。
仕組みの話をする前に、MonoDevelopコミュニティによるアドインについて説明しておこう。MonoDevelopで使用できるアドインは、アドインマネージャー(次の画面)から追加・削除できる(これはXamarin Studioのアップデートに使用されるダイアログとは別物だ)。
このダイアログの[Gallery]タブには、(現在インストールされていない)コミュニティアドインがリストアップされる。そのカタログは、MonoDevelopの公式リポジトリからダウンロードされる。リポジトリは、自分で追加することもできる。MonoDevelopの公式リポジトリを使用しないカスタムアドイン開発者は、独自のカタログを公開していることも多いので、その場合はMonoDevelopユーザーが自分で追加する必要がある。
どのようなアドインが存在するかは、筆者はここで細かく紹介することはしないので、読者の皆さんに確かめていただきたい。
MonoDevelopのアドインは、「mono-addins」というライブラリの機構に基づいて作成されており、自分でアドインを作成する場合は、その流儀に従う必要がある。アドインは、IDE側で定義された「拡張ポイント」に、拡張する機能の名前とコードを記述したアドインアセンブリ名.addin.xml
というアドイン記述XMLファイルを必要とする。このXMLファイルを「EmbeddedResource」としてアドインアセンブリのdllに含めることで、MonoDevelopがこれをアドインとして認識できるようになる。
MonoDevelop本体には、細々としたコンポーネントが、アドインとして実装されている。例えば、少しだけ例を挙げるなら、以下の機能は、それぞれアドインとして実装されている。
- アセンブリブラウザー
- 16進エディター
- 正規表現ツールキット
アドインの拡張ポイントはXPathのようなパス名で識別され、これは必ずしもMonoDevelopによって安定した識別子が与えられているとは言えないので、IDEのバージョンが上がると、それまで機能していたアドインが部分的に機能しなくなる場合もある。使えていたアドインの機能が使えなくなったと思ったら、アドインダイアログで、そのアドインが無効になっていないかを確認した方がよいだろう。また、アドイン開発者であれば、アドインをビルドする際に、参照アセンブリで使用していたAPIが変更されて、ビルドエラーになって気付くことも多いだろう(もっとも、これもその依存IDEコンポーネントのAPIがどれだけ安定しているかに依存する)。
カスタムアドインを作成する方法については、ここでは詳しく取り上げる余地がないので、MonoDevelop公式サイトのウォークスルーガイドを参照されたい。
MonoDevelopに独自拡張機能を追加することは、カスタムアドインで簡単に行える。それは「メインメニューに項目を1つ追加するだけ」というレベルではなく、独自のアプリケーションモデルを追加したり、[プロジェクト]パッドに手を加えてNuGetサポートやWebサービス参照を追加したりするようなレベルの改変が、アドインを書くレベルで実現可能だということだ。
もしクールなアドインを開発できたら、ぜひともコミュニティに公開していただきたいと思う。XamarinのMonoDevelopハッカーには、独自アドインの作成から始めて、MonoDevelopをハックする仕事に就いたメンバーも複数存在している。開発コミュニティでフィードバックを得たり質問を投げたりすることもできるだろう。
※以下では、本稿の前後を合わせて5回分(第10回~第14回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
10. Xamarin.AndroidにおけるJava相互運用の仕組みと、Javaバインディング・プロジェクト
Xamarin.AndroidでJavaとの相互運用を実現するアーキテクチャについて、さらにメモリ管理などの注意点を説明。さらにXamarin.Androidの制限事項についても解説する。
11. Xamarin Studio/MonoDevelopの基本機能と、C#コーディング補助機能
MonoDevelopとXamarin Studioはどう違うのか? MonoDevelopの基本的な機能を解説。C#コーディング補助機能についても紹介する。
12. 【現在、表示中】≫ MonoDevelopにおけるビルド/実行/デバッグと、iOS/Android向けのGUIデザイナー
MonoDevelopでアプリをビルド/実行/デバッグするための機能を解説。iOS/Android向けのGUIデザイナーや、MonoDevelopのカスタムアドインについても紹介する。
13. Xamarinと、ポータブル・クラス・ライブラリ(PCL)
複数プラットフォーム向けのライブラリを作れるPCLの概要と利点について解説。また、Xamarin.iOSやXamarin.Androidでの利用方法や、XamarinでPCLを実現する仕組み、PCLの課題を説明する。