Monoに関するTips
Monoのmscorlib.dllにはMono.Runtimeクラスが含まれているので、この型の情報が取得できるかどうかでランタイムがMonoかそうでないかを調べることが出来る。 ちなみに、Mono.Runtimeクラスはinternalなのでインスタンスは作成できない。
using System; class runtime { public static void Main() { Console.WriteLine("runtime: {0}", Type.GetType("Mono.Runtime") == null ? ".NET Framework?" : "Mono"); Console.WriteLine("version: {0}", Environment.Version); } }
runtime: Mono version: 2.0.50727.1433
runtime: .NET Framework? version: 2.0.50727.3082
参考:FAQ: Technical - Mono, How can I detect if am running in Mono?
.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かどうかで判断すればよい。
以下のサンプルにおいて、
を表す。
using System; class platform { public static void Main() { var p = (int)Environment.OSVersion.Platform; //Console.WriteLine("unix? {0}", Environment.OSVersion.Platform == PlatformID.Unix); Console.WriteLine("unix? {0}", (p == 4) || (p == 6) || (p == 128)); Console.WriteLine("version: {0}", Environment.OSVersion); } }
unix? True version: Unix 2.6.28.11
unix? False version: Microsoft Windows NT 5.1.2600 Service Pack 3
参考:FAQ: Technical - Mono, How to detect the execution platform ?
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は発生しなくなる。
cd /usr/lib ln -s libgdiplus.so.0 libgdiplus.so