2012-01-24 20 views
0

可能性の重複をレジストリを読み込むとき:奇妙な行動C#で

var b1 = Registry.LocalMachine.OpenSubKey("software", true); 
var b2 = Registry.LocalMachine.OpenSubKey("software", true).OpenSubKey("company"); 
var r1 = Registry.LocalMachine.OpenSubKey("software").OpenSubKey("company").GetValueNames(); 
string resultString = Registry.LocalMachine.OpenSubKey("Software", true).CreateSubKey("company").GetValue(name).ToString(); 

私はname = "ApplicationDirectory"でそれを呼び出す:
C# WOW6432 registry node messin things up

これはコードです。最後の行では、最初の2つの変数が(Nameプロパティに基づいて)正しい場所を指しています。問題はr1であり、HKEY_LOCAL_MACHINE\SOFTWARE\companyの内容はリストされていませんが、むしろHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\companyです。どうしてこれなの?これは64ビットマシンのリダイレクションですか?

+0

短い回答:[はい](http://msdn.microsoft.com/en-us/library/aa384232(v = vs.85).aspx)。 – Blorgbeard

+0

64ビットコンピュータには32ビットに分割されたレジストリセクションがあります。私はそれがレジストリ仮想化と呼ばれると思います。 –

+0

http://stackoverflow.com/questions/8959983/c-sharp-wow6432-registry-node-messin-things-up/8960020#8960020 –

答えて

2

はい、64ビットマシン上の32ビットアプリケーションのリダイレクトがあります。あなたの質問のコメントを見てください。this SO answer

.Net 4以上をターゲットにしている場合は、Wow6432Node(32ビットアプリケーションで使用)と「標準」ノード(64ビットアプリケーションで使用されるノード)の両方にアクセスできます。RegistryKey.OpenBaseKeyメソッドは、 RegistryViewのパラメータを使用して、使用する正しいノードを選択することができます。

.Net 3.5以前のバージョンを使用している場合は、64ビットマシンで32/64ビットのレジストリキーを両方読み込めるようにするには、P/Invokeを使用する必要があります。 RegOpenKeyExを使用し、希望するアクセスのフラグとしてKEY_WOW64_32KEYを指定する必要があります。しかし、これは別の話であり、あなたの質問の範囲外です。