.NET Framework が動作するプラットフォームを取得するには System.Environment.OSVersion を取得すれば良いように思います。しかし以下のコードを Mac OS X で動かすと,期待する結果を得られません。
var platform = Environment.OSVersion.Platform; Console.WriteLine(platform == PlatformID.MacOSX); // false
実は Mac OS X では platform
には PlatformID.Unix
になります[A]。
苦肉の策ではありますが, UNIX 系 OS に標準で搭載されている uname
を用いて OS を調べることができます[B]。
var platform = Environment.OSVersion.Platform; if (platform != PlatformID.Unix) { return platform; } using (var uname = new Process()) { uname.StartInfo.FileName = "uname"; uname.StartInfo.Arguments = "-s"; uname.StartInfo.RedirectStandardOutput = true; uname.StartInfo.UseShellExecute = false; uname.Start(); var kernelName = uname.StandardOutput.ReadLine(); uname.WaitForExit(); return kernelName == "Darwin" ? PlatformID.MacOSX : PlatformID.Unix; }
カーネルの名前が Darwin ならば Mac OS X,そうでなければその他の UNIX であるとしています。 PATH
が変更されていたら例外が投げられるなどいろいろ問題がありますが,とりあえずうまくいくと思います。
脚注
- Bug 515570 - System.Environment.OSVersion.Platform returns wrong result on Mac OS X [↩]
- リンク先では
-a
オプションと書いてありますが,-s
オプション (オプションなしと同じ) で十分だとます。 [↩]