2009-07-02 3 views
27

Мое приложение .NET (любой процессор) должно прочитать значение реестра, созданное 32-разрядной программой. В 64-битной Windows это происходит под ключом Wow6432Node в реестре. Я прочитал, что вы не должны жестко кодировать Wow6432Node, так что это правильный способ доступа к нему с .NET?Как открыть раздел реестра WOW64 из 64-разрядного приложения .NET

ответ

12

В случае, когда вам явно нужно прочитать значение, написанное 32-разрядной программой в 64-битной программе, это нормально, чтобы ее жестко закодировать. Просто потому, что на самом деле нет другого выбора.

Я бы, конечно, выделил его на вспомогательную функцию. Например

public RegistryKey GetSoftwareRoot() { 
    var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node" 
    : @"Software"; 
    return Registry.CurrentUser.OpenSubKey(path); 
} 
+0

Справедливая оценка - спасибо Джаред! – marijne

+5

Предупреждение: MS говорит, что этот подход (hardcoding «Wow6432Node») не поддерживается. См. Http://msdn.microsoft.com/en-us/library/aa384232(VS.85).aspx – Richard

+6

-1: Это поведение ломается в Windows 7/Windows Server 2008 R2, поскольку вместо этого они используют общие ключи реестра: http : //msdn.microsoft.com/en-us/library/aa384253 (VS.85) .aspx – Powerlord

16

Правильный путь должен был бы назвать нативный API реестра и передавая KEY_WOW64_32KEY флаг RegOpenKeyEx/RegCreateKeyEx

+0

Следует отметить, что это решение применимо только при спрямлении или использовании кода на C++. – Kyle

+0

@ Zenox - Это абсолютно правильное решение, даже если вы используете язык C#, конечно, вы бы глупо его использовать. –

6

Расширение ответ Андерса, есть good example of wrapping the resulting handle in a .NET RegistryKey object on Shahar Prish's blog - обязательно прочитать комментарии тоже, хотя.

Обратите внимание, что неприкрашенное использование the pinvoke.net wrapper of RegOpenKeyEx чревато проблемами.

+0

Это отличное решение. – adzm

52

Если вы можете изменить целевую .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); 
} 
+1

Это решение работает с моим 64-битным модульным тестированием Win7. Благодарю. – Jirapong

+2

Это способ прочитать реестр. WoW6432Node не следует читать напрямую, как Microsoft обрабатывает это через свой API и сказал, что он может измениться в будущем. – Jason

+0

Что делать, если вы не можете изменить на 4.x? Использовать метод выше? –

 Смежные вопросы

  • Нет связанных вопросов^_^