Создайте 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 на ваш код.