Создать 64-битный ключ реестра (не WOW64) из 32-битного приложения - PullRequest
13 голосов
/ 04 февраля 2010

У меня есть установщик Visual Studio, который создает некоторые ключи реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp

но разделы реестра, которые он создает, автоматически появляются в Wow6432Node:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp

Как игнорировать Wow6432Node при создании ключей реестра в моем коде C #, выполняемом MSI?

Ответы [ 3 ]

22 голосов
/ 29 мая 2010

Просто к сведению, .NET 4.0 поддерживает это изначально. Пример:

RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);

Затем вы можете использовать эту переменную RegistryBase , чтобы получить доступ ко всему в 64-битном представлении HKLM. И наоборот, Registry32 позволит 64-разрядному приложению получить доступ к 32-разрядному представлению реестра.

1 голос
/ 05 ноября 2013

Поскольку документации по OpenBaseKey очень мало, я остановлюсь на ответе шифуима и предоставлю решение для ОП:

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 в вашем коде.

1 голос
/ 04 февраля 2010

Взгляните на http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html.. Вам нужно будет использовать редиректор реестра и передать правильное значение для маски доступа. К сожалению, вам понадобится pInvoke.

...