Monoはオープンソースの.NET Framework互換ランタイム。俺はUbuntuやMac OSXで自分の作ったWindowsアプリを動かすのに使っている。

Ubuntuのaptでインストールできるバージョンは2.1、Macのmacportsでは2.4がインストールできるが、Macだけはmono-projectからdmgダウンロードしてきてインストールして使ってる。


ちゃんとGUIも再現される。下はWindowsとVMWare上のUbuntuで同じアプリを起動したところ
C# – UDP/IPでチャットアプリより)
UDPの勉強


■アプリを起動する

mono App.exe
で起動する。DLLなども問題なく読み込まれる。


■Monoで動くように実装するポイント
Mono2.xは.NET Framework2.0と3.0の間ぐらいまで実装されているらしい。
  • DirectXは動かない、というか無い
  • Win32APIももちろん無いので使わない
  • 設定はレジストリではなく.configファイルに保存しよう
  • .NET3.0以降で増えた関数型言語由来の機能はあまり使わない方がいい。ラムダ式とか。
  • delegateやthreadは使える
  • Genericsのマイナーなメソッドは使わない。普通にAddとかRemoveとか使う分にはいいが、高階関数を使ってそうな機能(ソートとか)はあまり触らない方がいい
  • ディレクトリの区切り文字は \ ではなく Path.DirectorySeparatorChar を使う
  • 起動ディレクトリの取得は Application.StartupPath ではなく
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
    を使うと、System.Windows.Formsを読み込まなくても済む
基本的にWindowsネイティブな機能を使わないようにしていれば、Generics関連のメソッドが無い以外で困ったことは多分ない。


■開発の手順
  1. WindowsのVisualStudioで開発する。
  2. Monoで動くか確かめるために、VMWareでUbuntuを起動する。
  3. Dokan SSHFSでUbuntuのディスクをマウントする
  4. 適当にコードを書く。Windowsで問題なく動くところまで確認する。
  5. マウントしたディスクにRealSyncで転送する
  6. Ubuntuでも動かしてみる。デバッグの方法がよくわからない。特にMonoで実装されていない関数を実行してしまった時は原因特定に時間がかかってしまう・・・
  7. Ubuntuのapt版Monoで動けばmacportsのMonoでも動く。バージョンが高いので。