2010-02-04 4 views
13

У меня есть установки Visual Studio, который создает некоторые ключи реестра:Создание 64-битный ключ реестра (не WOW64) из 32 разрядного приложения

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp 

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp 

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

+0

Я предполагаю, что, поскольку ваше приложение 32-разрядное, Windows убедитесь, что изменения подпадают под 'Wow6432Node'. Чтобы получить его из этого узла и поместить записи под нормальные пути, ваше приложение должно быть 64-битным. – legends2k

ответ

21

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

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

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

+1

отличный ответ. просто и точно. – Simon

1

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

+0

О, фантастическое. Есть ли какой-нибудь хороший .NET API, который кто-то написал, чтобы обернуть вызовы pinvoke и сделать его не таким страшным? –

+0

Я бы не сказал, что это действительно ужасно. Возможно, немного неудобно. Просто добавьте DllImports и определите KEY_WOW64_64KEY. Более краткий пример (для удаления) можно найти на http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx. – nithins

1

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

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