Ответ 1
Вы можете использовать RegistryKey.OpenBaseKey для решения этой проблемы:
var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var reg = baseReg.CreateSubKey("Software\\Test");
Я пытаюсь вставить некоторые простые ключи реестра с помощью Microsoft.Win32.RegistryKey в С#, но путь автоматически изменяется:
HKEY_LOCAL_MACHINE\SOFTWARE\Test
к
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Test
Я попробовал Google, но я получаю только некоторые неопределенные и запутанные результаты. Кто-нибудь раньше занимался этим вопросом? Некоторый пример кода был бы намного appereciated.
Вы можете использовать RegistryKey.OpenBaseKey для решения этой проблемы:
var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var reg = baseReg.CreateSubKey("Software\\Test");
Я не знаю, как его решить, используя REG файл. Но только в BAT файле, как следует:
Вы должны добавить /reg:64
в конце командной строки.
например:
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" /v "OEMBackground" /t REG_DWORD /d 0x00000001 /f /reg:64
Источник: Wow6432Node и как развернуть настройки реестра для 64-битных систем через Sccm
В WOW64 определенные ключи реестра перенаправляются (ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ). Когда 32-разрядное или 64-разрядное приложение вызывает вызов реестра для перенаправленного ключа, редиректор реестра перехватывает вызов и сопоставляет его с соответствующим физическим местоположением реестра. Для получения дополнительной информации см. Редиректор реестра.
Вы можете использовать RegistryView Enumeration в RegistryKey.OpenBaseKey Method открыто открыть 32-битное представление и напрямую обратиться к HKLM\Software \.
Вот рабочий код, который я разработал как для чтения, так и для записи ТОЛЬКО 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");