冰呂のまったりブログ

ビジネスからプログラミング・デザイン等 日々興味を持った内容を配信しています

【C#】32bitアプリと64bitアプリのレジストリの扱い

移転しました。

約3秒後に自動的にリダイレクトします。

f:id:hirouf:20150118211614j:plain

こんばんは。HIGHROです。
今回、レジストリを扱うプログラムをVisualStudio2012で作成していて、つまづいた内容をメモしておきたいと思います。

プラットフォームをx86で作成したアプリケーションとx64で作成したアプリケーションで、レジストリを参照する場所が違いました。
どうしても、x86でビルドしたアプリケーションでWow6432Nodeでない方を参照しようとしても、Wow6432Nodeの方に自動的にリダイレクトされてしまいます。

ここで、ちょっとプラットフォームにおけるレジストリの扱いをまとめてみました。

例:HKLM¥Software¥Microsoft¥Windows¥〜を参照する場合

x86(32bit)で作成したアプリケーション
実行環境「32bitOS」の場合:HKLM¥Software¥Microsoft¥Windows¥〜
実行環境「64bitOS」の場合:HKLM¥Software¥Wow6432Node¥Microsoft¥Windows¥〜

x64(64bit)で作成したアプリケーション
実行環境「32bitOS」の場合:参照不可(そもそも実行しない)
実行環境「64bitOS」の場合:HKLM¥Software¥Microsoft¥Windows¥〜

AnyCPUで作成したアプリケーション
実行環境「32bitOS」の場合:HKLM¥Software¥Microsoft¥Windows¥〜
実行環境「64bitOS」の場合:HKLM¥Software¥Microsoft¥Windows¥〜

となるみたいです。
AnyCPUで作成すれば、32bitOS環境では32bitのレジストリを参照し、64bitOS環境では64bitのレジストリを参照するので、両方のOSで対応するアプリケーションを作成する場合は、AnyCPUで作成する方がいいかもしれないです。
※AnyCPUで作成したアプリを64bitOSで実行すると、64bitOS用アプリケーションとして動作します。

64bit環境で実行しているアプリケーションでWow6432Nodeの情報を取得したい場合は、直接レジストリを指定する(例;HKLM¥Software¥Wow6432Node¥Microsoft¥Windows¥〜)ことで、参照することができます。