Registry.SetValue не работает для x86

Я хочу изменить определенное значение (тип REG_SZ) в реестре для x64 и x86, но метод SetValue не меняет значение для x86. Х64 работает отлично. Это мой код:

RegistryKey regKeySpecific = RegistryKey.OpenBaseKey(
                                   RegistryHive.LocalMachine, RegistryView.Registry32);

RegistryKey registryKey = regKeySpecific.OpenSubKey(
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FolderDescriptions\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}\\PropertyBag", true);

registryKey.SetValue("ThisPCPolicy", "Show", RegistryValueKind.String);

registryKey.Close();

Я использую RegistryView.Registry32 параметр в первой строке кода, чтобы изменить значение в реестре x86, но это не работает.

Проблема выявлена, но не решена. Этот код всегда изменяет ключ в реестре x64 (WOW6432Node):

"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FolderDescriptions\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}\\PropertyBag"

1 ответ

Решение

Очевидно, у вас есть программа, выполняющаяся в 32-разрядном режиме x86. Windows x64 выполняет перенаправление реестра для 32-разрядных приложений, поэтому при попытке доступа

SOFTWARE\Microsoft

будет вместо доступа

SOFTWARE\WOW6432Node\Microsoft

Registry32 flag делает такое же перенаправление доступным для приложений.NET, работающих под x64. Это не имеет никакого эффекта для вас, потому что ОС уже включила это перенаправление.

Чтобы получить доступ SOFTWARE\Microsoft на 64-битной ОС из 32-битного процесса, вы должны использовать Registry64 флаг, который отключает перенаправление.

Помните (ваш вопрос имеет это задом наперед)

  • SOFTWARE\ это родной реестр, 64-битный на 64-битной ОС

  • SOFTWARE\WOW6432Node\ 32-разрядный реестр совместимости в 64-разрядной ОС

WOW64 - это не тот уровень, который обеспечивает 64-битную поддержку. Это уровень, который обеспечивает поддержку 32-битных приложений, когда ОС является 64-битной. Это означает "(поддержка) Windows (32) на Windows64".

Другие вопросы по тегам