プロセスアフィニティマスクをProcessクラスのプロパティで設定する

この"プロセスアフィニティマスク"だが、Processクラスのプロパティとしてちゃんと用意されていることが判明した。

Process.ProcessorAffinity プロパティ

先ほどのイベントハンドラは、以下のように書き換えることができる。P/Invokeの記述も一切不要だ。

private void Form1_Load(object sender, EventArgs e)
{
    this.label2.Text = "System Affinity Mask  : " + Convert.ToString(Process.GetCurrentProcess().ProcessorAffinity.ToInt32(), 2);
    Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(0x0e);
    this.label1.Text = "Process Affinity Mask : " + Convert.ToString(Process.GetCurrentProcess().ProcessorAffinity.ToInt32(), 2);
}

実行結果は先ほどのP/Invokeを使ったものと全く同じであることを確認しているので、ここでは省略する。

我ながら本当に間抜けだと思うが、昔の経験からしてこのようなカーネルよりの設定はまずWin32APIじゃないとできないだろうと端から.NETに期待していなかったのだが、良い意味で裏切られた。
それにしても、このようなプロパティがちゃんと用意されている辺りは嬉しい。