Книга: C# для профессионалов. Том II

Классы реестра в .NET

Классы реестра в .NET

Доступ к реестру осуществляется с помощью двух классов в пространстве имен Microsoft.Win32Registry и RegistryKey. Экземпляр RegistryKey представляет ключ реестра. Этот класс реализует методы для доступа к ключам-потомкам, для создания новых ключей или для чтения или изменения значений ключа. Другими словами, чтобы делать все необходимое с ключом реестра (за исключением задания уровней безопасности для ключа). RegistryKey является классом, который будет использоваться практически для любой работы с реестром. Registry, напротив, является классом, экземпляры которого никогда не создаются. Его роль состоит в предоставлении экземпляров RegistryKey, которые являются ключами верхнего уровня, различными ульями, чтобы начать перемещение по реестру. Registry предоставляет эти экземпляры через семь статических свойств, называемых соответственно ClassesRoot, CurrentConfig, CurrentUser, DynData, LocalMachine, PerformanceData и Users.

Поэтому, например, чтобы получить экземпляр RegistryKey, который представляет ключ HKLM, необходимо написать:

RegistryKey Hklm = Registry.LocalMachine;

Процесс получения ссылки на объект RegistryKey называют открытием ключа.

Можно было бы ожидать, что методы объекта RegistryKey будут подобны методам класса DirectoryInfo при условии, что реестр имеет иерархическую структуру, аналогичную файловой системе, но в действительности это не так. Часто способ доступа к реестру отличается от способа, который используется для файлов и папок, и RegistryKeyреализует методы, которые это отражают.

Наиболее очевидное различие состоит в том, как открывают ключ реестра в заданном месте в реестре. Класс Registry не имеет никаких открытых конструкторов, которые можно использовать, он не имеет также никаких методов, которые позволят перейти прямо к ключу, задавая его имя. Вместо этого ожидается, что вы спуститесь вниз к этому ключу с вершины соответствующего улья. Если желательно создать экземпляр объекта RegistryKey, то единственный способ — начать с соответствующего статического свойства Registry и двигаться оттуда вниз. Поэтому, например, если нужно прочитать некоторые данные в ключе HKLM/Software/Microsoft, то ссылку на него можно получить следующим образом:

RegistryKey Hklm = Registry.LocalMachine;
RegistryKey HkSoftware = Hklm.OpenSubKey("Software");
RegistryKey HkMicrosoft = HkSoftware.OpenSubKey("Microsoft");

Доступ к ключу реестра, полученный таким образом, будет предоставлен только для чтения. Если вы хотите иметь возможность записи в ключ (что предполагает запись в его значения либо создание или удаление его прямых потомков), необходимо использовать другую перегруженную версию OpenSubKey, которая получает второй параметр типа bool, указывающий, требуется ли иметь доступ к ключу для чтения-записи. Поэтому, например, при желании модифицировать ключ Microsoft (предполагая, что вы являетесь системным администратором с полномочиями на это), необходимо написать следующее:

RegistryKey Hklm = Registry.LocalMachine;
RegistryKey HkSoftware = Hklm.OpenSubKey("Software");
RegistryKey HkMicrosoft = HkSoftware.OpenSubKey("Microsoft", true);

В связи с этим, так как этот ключ содержит информацию, используемую приложениями Microsoft, в большинстве случаев нежелательно модифицировать этот конкретный ключ.

Метод OpenSubKey() будет вызываться, если ожидается, что ключ уже присутствует. Если ключ отсутствует, то он возвращает ссылку null. Если желательно создать ключ, то необходимо использовать метод CreateSubKey() (который автоматически предоставляет доступ к ключу для чтения-записи через возвращаемую ссылку):

RegistryKey Hklm = Registry.LocalMachine;
RegistryKey HkSoftware = Hklm.OpenSubKey("Software");
RegistryKey HkMine = HkSoftware.CreateSubKey("MyOwnSoftware");

Способ работы CreateSubKey() достаточно интересен: он будет создавать ключ, если тот еще не существует, а если уже существует, то будет возвращать экземпляр RegistryKey, который представляет существующий ключ. Причина такого поведения метода состоит в способе использования реестра. Реестр в целом содержит долговременные данные, например, конфигурационную информацию для Windows и различных приложений. Поэтому не очень часто возникает ситуация, когда необходимо явно создать ключ.

Более распространена ситуация, когда приложению необходимо убедиться, что некоторые данные присутствуют в реестре, другими словами, создать соответствующие ключи, если они еще не существуют, но ничего не делать, если они существуют. Метод CreateSubKey() прекрасно с этим справляется. В отличие, например, от ситуации с FileInfo.Open() у CreateSubKey() нет возможности случайно удалить какие-либо данные. Если целью действительно является удаление ключей реестра, то необходимо явно вызвать метод RegistryKey.Delete(). Это имеет смысл с учетом важности реестра для Windows. Меньше всего хотелось бы полностью разрушить Windows, удалив пару важных ключей во время отладки обращений к реестру в C#.

Когда ключ реестра для чтения или модификации найден, можно использовать методы SetValue() или GetValue() для задания или получения из них данных. Оба эти метода получают в качестве параметра строку, задающую имя значения, a SetValue() требует дополнительно ссылку на объект, содержащий детали значения. Так как параметр определяется как объектная ссылка, то он может действительности быть ссылкой на любой класс по желанию. SetValue() будет определять по типу реально предоставленного класса, как задать значение REG_SZ, REG_DWORD или REG_BINARY. Например:

RegistryKey HkMine = HkSoftware.CreateSubKey("MyOwnSoftware");
HkMine.SetValue("MyStringValue", "Hello World");
HkMine.SetValue(MyIntValue", 20);

Этот код задает для ключа два значения: MyStringValue будет иметь тип REG_SZ, а MyIntValue — тип REG_DWORD. В последующем примере будут рассмотрены только эти два типа.

RegistryKey.GetValue() работает по большей части таким же образом. Он определен для возврата объектной ссылки, а значит, он может на самом деле вернуть ссылку на string, если обнаружит значение типа REG_SZ, и int, если это значение имеет тип REG_DWORD:

string StringValue = (string)HkMine.GetValue("MyStringValue");
int IntValue = (int)HkMine.Get.Value("MyIntValue");

И наконец, по окончании чтения или модификации данных ключ необходимо закрыть:

HkMine.Close();

Помимо этих методов, RegistryKey реализует большое число других методов и свойств. Таблицы представляют выборку наиболее употребительных:

Свойства

Имя свойства Назначение
Name Имя ключа (только для чтения)
SubKeyCount Число потомков этого ключа
ValueCount Сколько значений содержит ключ

Методы

Имя Назначение
Close() Закрывает ключ
CreateSubKey() Создает подключ с заданным именем (или открывает его, если он уже существует)
DeleteSubKey() Удаляет заданный подключ
DeleteSubKeyTree() Рекурсивно удаляет подключ и всех его потомков
DeleteValue() Удаляет именованное значение из ключа
GetSubKeyNames() Возвращает массив строк, содержащих имена подключей
GetValue() Возвращает именованное значение
GetValueNames() Возвраает массив строк, содержащих имена всех значений ключа
OpenSubKey() Возвращает ссылку на экземпляр RegistryKey, который представляет заданный подключ
SetValue() Задает именованное значение

Оглавление книги


Генерация: 1.297. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз