読者です 読者をやめる 読者になる 読者になる

気まま研究所ブログ

思ったことをてきとーに書きます。

WOW64で起動した際に64bitレジストリへアクセスする

64bit OSにおいて、32bitビルドしたアプリケーションはWOW64を通して実行されます。
普通にプログラムを組んでる分にはさほど意識する必要はありませんが、レジストリを扱う場合少々面倒なことになります。

32bitアプリケーションを32bitで実行し、レジストリにアクセスした際はどこにアクセスしようが特に気にする必要はありませんが、64bitにおいては一部だけWow6432Nodeの場所を指定していまいます。
64bitでビルドすればこの問題は回避できるのですが、そうもいきません。

巷に転がっている方法でレジストリを取得する場合は

RegistryKey rKey = Registry.LocalMachine.OpenSubKey("キーの名前");
string value = (string)rKey.GetValue("値の名前");
rKey.Close();

こういったコードで取得しますが、これだとWOW64で実行された場合Wow6432Nodeの値を拾ってしまいます。
Wow6432Nodeでない方の値を取得する場合は

RegistryKey prerKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey rKey = prerKey.OpenSubKey("キーの名前");
string value = (string)rKey.GetValue("値の名前");
rKey.Close();

こうすることでWow6432Nodeでない方の値が取得できます。

なお、32bit OSでRegistryView.Registry64を指定した場合は32bitビューが表示されます。

参考になれば幸いです。