Создайте 64-битный раздел реестра (не WOW64) из 32-разрядного приложения
У меня есть установщик Visual Studio, который создает некоторые ключи реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
но ключи реестра, которые он создает, автоматически появляются под Wow6432Node:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
Как игнорировать Wow6432Node при создании ключей реестра в моем С# -кодировании, выполняемом с помощью msi?
Ответы
Ответ 1
Просто FYI,.NET 4.0 поддерживает это изначально. Пример:
RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
Затем вы можете использовать переменную RegistryBase для доступа к чему-либо в 64-битном представлении HKLM. И наоборот, Registry32 позволит 64-разрядному приложению получить доступ к 32-разрядному представлению реестра.
Ответ 2
Посмотрите http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html. Вам нужно будет использовать редиректор реестра и передать правильное значение для маски доступа. К сожалению, вам понадобится pInvoke.
Ответ 3
Так как документации о OpenBaseKey
очень мало, я буду расширять ответ shifuimam и предоставить решение для OP:
Private Sub Foo()
Dim myAppIs64Bit = Environment.Is64BitProcess
Dim baseKey As RegistryKey
If (myAppIs64Bit) Then
baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
Else
baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
End If
Dim myAppKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\MyApp")
End Sub
Если приложение 32-разрядное, myAppKey
указывает на HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
. Если 64-бит, он указывает на HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
.
Преимущество OpenBaseKey
заключается в том, что он устраняет необходимость ссылки Wow6432
на ваш код.