Избегайте Перенаправления Реестра Wow6432Node
Я пытаюсь вставить некоторые простые ключи реестра с помощью Microsoft.С Win32.RegistryKey в c# , но путь автоматически изменяется от:
HKEY_LOCAL_MACHINESOFTWARETest
to
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeTest
я попробовал google, но я получаю только некоторые расплывчатые и запутанные результаты. Кто-нибудь занимался этим вопросом раньше? Некоторые примеры кода были бы намного appereciated.
4 ответов
вы можете использовать RegistryKey.OpenBaseKey для решения этой проблемы:
var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var reg = baseReg.CreateSubKey("Software\Test");
в WoW64 некоторые разделы реестра перенаправляются (программное обеспечение). Когда 32-разрядное или 64-разрядное приложение выполняет вызов реестра для перенаправленного ключа, перенаправитель реестра перехватывает вызов и сопоставляет его с соответствующим физическим местоположением реестра ключа. Дополнительные сведения см. В разделе Реестра Редиректор.
можно использовать Перечисление RegistryView on объект registrykey.Метод OpenBaseKey для явного открытия 32-разрядного представления и доступа HKLM\программное обеспечение\ напрямую.
Я не знаю, как решить его с помощью a .reg-файл. Но только в файле BAT, как следует:
вы должны добавить /reg:64
в конце командной строки.
ex:
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" /v "OEMBackground" /t REG_DWORD /d 0x00000001 /f /reg:64
источник: Wow6432Node и как развернуть параметры реестра в 64-битных системах через Sccm
вот рабочий код, который я разработал для чтения и записи только 32-битного реестра. Он работает как в 32-разрядных и 64-разрядных приложений. Вызов "чтение" обновляет реестр, если значение не установлено, но очень очевидно, как удалить это. Он требует .Net 4.0 и использует методы OpenBaseKey/OpenSubKey.
в настоящее время я использую его, чтобы разрешить 64-разрядной фоновой службе и 32-разрядному приложению лотка доступ к тем же разделам реестра бесшовно.
using Microsoft.Win32;
namespace SimpleSettings
{
public class Settings
{
private static string RegistrySubKey = @"SOFTWARE\BlahCompany\BlahApp";
public static void write(string setting, string value)
{
using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey))
using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, true))
{
registryKey.SetValue(setting, value, RegistryValueKind.String);
}
}
public static string read(string setting, string def)
{
string output = string.Empty;
using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey))
using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, false))
{
// Read the registry, but if it is blank, update the registry and return the default.
output = (string)registryKey.GetValue(setting, string.Empty);
if (string.IsNullOrWhiteSpace(output))
{
output = def;
write(setting, def);
}
}
return output;
}
}
}
использование: Поместите это в свой собственный файл класса (.cs) и назовем его так:
using SimpleSettings;
string mysetting = Settings.read("SETTINGNAME","DEFAULTVALUE");