Подтвердить что ты не робот

Чтение и запись на ключи реестра 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 напрямую?

4b9b3361

Ответ 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);