.NET の動作しているプラットフォームを取得


.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 が変更されていたら例外が投げられるなどいろいろ問題がありますが,とりあえずうまくいくと思います。

脚注

  1. Bug 515570 - System.Environment.OSVersion.Platform returns wrong result on Mac OS X []
  2. リンク先では -a オプションと書いてありますが, -s オプション (オプションなしと同じ) で十分だとます。 []