Monoに関するTips
使用しているランタイムがMonoかどうか調べる
Monoのmscorlib.dllにはMono.Runtimeクラスが含まれているので、この型の情報が取得できるかどうかでランタイムがMonoかそうでないかを調べることが出来る。 ちなみに、Mono.Runtimeクラスはinternalなのでインスタンスは作成できない。
実行しているプラットフォームがUnixかどうか調べる
.NET Framework 2.0以降を使用する場合は、Environment.OSVersion.Platformの値がPlatformID.Unixかどうかで判断できる。 Monoの場合も同様に、2.0以降ではPlatformID.Unixかどうかで判断できる。 一方1.xの場合にはPlatformID.Unixは存在せず、Monoでは代わりに128が割り当てられていたため、ランタイムのバージョンを問わず判断するためにはEnvironment.OSVersion.Platformの値がPlatformID.Unixまたは128かどうかで判断すればよい。
以下のサンプルにおいて、
- 4は.NET Framework 2.0以降のPlatformID.Unixの値
- 6は.NET Framework 2.0 SP2以降のPlatformID.MacOSXの値
を表す。
名前付きミューテックスを使用する
Linux上で動作するMonoでは、名前付きミューテックスなどプロセス間で共有されるハンドルをエミュレートするために共有メモリを使用している。 2.8以降のMonoではデフォルトで共有ハンドルの使用が無効化されている。 有効にするには環境変数MONO_ENABLE_SHMをセットする。
MONO_ENABLE_SHMが設定されているか(共有ハンドルを使用できるか)どうかを実行時に知る方法は、Environment.GetEnvironmentVariableを使う以外には特に用意されていない模様。
gdiplus.dllでSystem.DllNotFoundExceptionとなる
Fedora 8で起きた問題。 System.Windows.Forms等を使ったアプリケーションを起動するとgdiplus.dllが原因でSystem.DllNotFoundExceptionが発生する。 これは$LD_LIBRARY_PATH(yumでインストールした場合は/usr/lib)にlibgdiplus.soが存在せず、動的リンクに失敗することが原因で起きる。
yumでMonoをインストールした場合は/usr/libにはlibgdiplus.so.0というファイル名でインストールされるので、シンボリックリンクを貼ればリンク出来るようになり、System.DllNotFoundExceptionは発生しなくなる。