Чтение и запись на ключи реестра x86 и x64 из того же приложения
Я запускаю свое приложение, скомпилированное как x86, и работает на 64-битной Windows.
Чтобы устранить проблему с ассоциациями файлов ClickOnce, я хочу прочитать некоторые значения CLSID из представления реестра x86 реестра и затем записать их в представление x64.
Чтобы быть ясным, это означает, что из приложения x86 я хочу одновременно читать из реестра реестра x86, а затем записывать в представление реестра x64. Я хочу взять значения, найденные в HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}
, и записать их в HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}
.
Как мне это сделать? Использование RegistryView
приводит к неожиданным результатам. Например, этот вызов OpenSubKey
возвращает null:
keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);
Если я использую RegistryView.RegistryDefault
или RegistryView.Registry64
, вместо этого он возвращает ключ, но я ожидаю, что он вернет значение null при использовании Registry64
, потому что этот ключ не существует в представлении x64 и не должно быть переадресации место.
Использует ли RegistryView
подходящую вещь, или я должен использовать WinAPI напрямую?
Ответы
Ответ 1
Возможно, я не понимаю, что вы просите, но если вы работаете в 32-битном процессе, все ваши ключи будут в Wow6432Node\xxxxx
node в любом случае. Поэтому, если вы попытались скопировать их из HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}
(и не указали 64-битный вид вручную) на HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}
, вы будете копировать одни и те же значения. Этот код должен работать:
keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
// Note this calls HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}:
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);
var regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
// Note this calls HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}:
var regularClassKey = regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);