Доступ к частному реестру Visual Studio 2017

Visual Studio использует частный куст реестра вместо "загрязняющего" системного реестра - обычно это выглядит примерно так:

C:\Users\Abx\AppData\Local\Microsoft\VisualStudio\15.0_4b0ba1c0\privateregistry.bin

[Чтобы определить установленные расширения, нам нужно посмотреть следующий ключ: Software\Microsoft\VisualStudio\15.0_4b0ba1c0\ExtensionManager\EnabledExtensions]

Каков самый простой способ загрузить и получить доступ к этому файлу с помощью ключа на С#?

Ответ 1

Чтобы просмотреть вручную, вы можете использовать приложение regedit.exe для загрузки файла privateregistry.bin, выполнив следующие действия:

  1. Запустите RegEdit.exe
  2. Выберите узел Computer\HKEY_LOCAL_MACHINE в левой панели.
  3. Выберите файл | Загрузите пункт меню Hive... и загрузите файл privateregistry.bin
  4. Когда будет предложено ввести имя ключа, просто введите что-то вроде "VSRegHive"
  5. Это загрузит данные в VSRegHive под узлом HKLM
  6. Когда вы закончите изучение, не забудьте выбрать VSRegHive и выбрать File | Перед выходом из утилиты RegEdit.exe выгрузите Hive..., иначе VS не запустится. Сохранение куста, загруженного в regedit, создает некую блокировку, которая препятствует запуску DevEnv.exe.

Программный доступ к ключу RegLoadAppKey - действительно ваш лучший выбор.

Ответ 2

У меня была аналогичная проблема, и я нашел эту публикацию SO. По моему опыту вы должны использовать конфигурацию x86 для своего проекта, иначе вы столкнетесь с исключением. Я адаптировал код к вашей проблеме.

ExternalSettingsManager ext = ExternalSettingsManager.CreateForApplication(@"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe");
SettingsStore store = ext.GetReadOnlySettingsStore(SettingsScope.UserSettings);
var propNames = store.GetPropertyNames(@"ExtensionManager\EnabledExtensions");
store.GetString(...)

В дополнение к вышеуказанному методу, возможно, можно использовать "обычные".Net методы для доступа к реестру после вызова "CreateForApplication". Просто используйте что-то вроде этого:

Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\VisualStudio\15.0\ExtensionManager\EnabledExtensions")