はじめに
今回、レジストリを扱うプログラムをVisualStudio2012で作成していて、つまづいた内容をメモしておきたいと思います。
VisualStudioではデフォルトではx86用のプラットフォームで作成する設定になっています。
C#ではRegistry.LocalMachine.CreateSubKeyなどを利用してレジストリにアクセスして必要な情報を取得しますが、x86で作成したアプリケーションとx64で作成したアプリケーションでは、レジストリを参照する場所が違いました。
参照先まとめ
ここで、ちょっとプラットフォームにおけるレジストリの扱いをまとめました。
例:HKLM¥Software¥Microsoft¥Windows¥〜を参照する場合
- x86(32bit)で作成したアプリケーション
- 実行環境「32bitOS」の場合:
→ HKLM¥Software¥Microsoft¥Windows¥〜 - 実行環境「64bitOS」の場合:
→ HKLM¥Software¥Wow6432Node¥Microsoft¥Windows¥〜
- 実行環境「32bitOS」の場合:
- x64(64bit)で作成したアプリケーション
- 実行環境「32bitOS」の場合:
→ 参照不可(そもそも実行しない) - 実行環境「64bitOS」の場合:
→ HKLM¥Software¥Microsoft¥Windows¥〜
- 実行環境「32bitOS」の場合:
- AnyCPUで作成したアプリケーション
- 実行環境「32bitOS」の場合:
→ HKLM¥Software¥Microsoft¥Windows¥〜 - 実行環境「64bitOS」の場合:
→ HKLM¥Software¥Microsoft¥Windows¥〜
- 実行環境「32bitOS」の場合:
となるようです。
AnyCPUで作成すれば、32bitOS環境では32bitのレジストリを参照し、64bitOS環境では64bitのレジストリを参照するので、両方のOSで対応するアプリケーションを作成する場合は、AnyCPUで作成する方がいいかもしれないです。
※AnyCPUで作成したアプリを64bitOSで実行すると、64bitOS用アプリケーションとして動作します。
64bit環境で実行しているアプリケーションでWow6432Nodeの情報を取得したい場合は、直接レジストリを指定する(例;HKLM¥Software¥Wow6432Node¥Microsoft¥Windows¥〜)ことで、参照することができます。
サンプルコード
簡単なサンプルコードです
using (var sk = Registry.LocalMachine.CreateSubKey(@"Software¥Microsoft¥Windows"))
{
// 〜〜〜〜〜〜
}
上記だとx86 または x64によって参照先が異なります。
ただし、下記の場合だと固定です。
using (var sk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,RegistryView.Registry64))
{
using (var sk1 = sk.CreateSubKey(@"Software¥Microsoft¥Windows"))
{
// 〜〜〜〜〜〜
}
}
OpenBaseKeyをりようすれば、参照先を指定できます。
最後に
初めてコーディングする方などは戸惑う可能性がありますので、ここら辺は押さえておきたいですね。
ぜひ参考までに。