Archive
Archive for the ‘コンピューター’ Category
4月 15th, 2012
.NET の動作しているプラットフォームを取得
4月 10th, 2012
.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オプション (オプションなしと同じ) で十分だとます。 [↩]
C# のジェネリックで Enum/Delegate 制約を使う
3月 31st, 2012
C# のジェネリック型制約には大きな制限があります。それは制約する型に System.Delegate や System.Enum が使えないということです。 F# や Nemerle といった,ジェネリックの制約型に制限がない別の言語を用いるという選択肢も当然考えられますが,可能な限り C# だけで解決したいということもあるかもしれません。
とは言っても C# でできないから困ってるのであって,本当に C# だけで解決するのは難しいです。そこでもう少し低レベルな MSIL を使って解決しましょう。
NemerleUnit で単体テスト
3月 5th, 2012
NemerleUnit は NUnit を用いた単体テスト用のマクロです。 NemerleUnit を使うと自然言語のように単体テストを記述することが可能になります。
Nemerle のブロック
2月 28th, 2012

最近のコメント