私の.NETアプリケーション(任意のCPU)は、32ビットプログラムによって作成されたレジストリ値を読み取る必要があります。64ビットWindowsでは、これはレジストリのWow6432Nodeキーの下にあります。Wow6432Nodeにハードコーディングするべきではないことを読みました。それで、.NETでそれにアクセスする正しい方法は何ですか?
28665 次
4 に答える
54
ターゲットの .Net バージョンを v4 に変更できる場合は、新しい OpenBaseKey 関数を使用できます。
RegistryKey registryKey;
if (Environment.Is64BitOperatingSystem == true)
{
registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
}
else
{
registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
}
于 2010-06-01T18:23:44.987 に答える
16
正しい方法は、ネイティブ レジストリ API を呼び出し、KEY_WOW64_32KEY
フラグを RegOpenKeyEx/RegCreateKeyEx に渡すことです。
于 2009-07-03T18:03:04.223 に答える
12
32 ビット プログラムによって書き込まれた値を 64 ビット プログラムで明示的に読み取る必要がある場合は、それをハード コードしてもかまいません。単純に、他に選択肢がないからです。
もちろん、ヘルパー関数に抽象化します。例えば
public RegistryKey GetSoftwareRoot() {
var path = 8 == IntPtr.Size
? @"Software\Wow6432Node"
: @"Software";
return Registry.CurrentUser.OpenSubKey(path);
}
于 2009-07-02T13:47:49.793 に答える
6
Anders の答えを拡張すると、結果のハンドルを .NET RegistryKey オブジェクトにラップする良い例が Shahar Prish のブログにあります。ただし、コメントも必ず読んでください。
RegOpenKeyEx の pinvoke.net ラッパーをそのまま使用すると、問題が発生することに注意してください 。
于 2009-08-13T08:50:40.600 に答える