Working with the Windows Registry in C#

The Windows Registry is a database that stores information pertaining to your computer in a hierarchical manner. In this programming tutorial, we will examine how to work with the Registry in C#. We will cover the basics of how the Registry works, and then we will show you how to use the Registry class in C# to programmatically add, update, or delete registry key/values.

Want to learn more C# programming and prefer a course tailored to C# developers? TechRepublic Academy has a great online programming class: The Complete C# Master Class Course we highly recommend.

What is the Windows Registry?

In the Windows operating system, the Registry represents a hierarchical database composed of keys, subkeys, predefined keys, hives, and value entries used to store data specific to a system or application. You may use the Windows Registry to save configuration details for your application so you can access them later if necessary.

Example of the Windows Registry

The Windows Registry was first introduced in Windows 95 and has been included in every subsequent version of Windows. It is a critical component of your operating system, and if it becomes corrupt, your system may become unstable or even unusable. For this reason, it is important to back up your Registry regularly.

Anatomy of the Windows Registry

As stated, the Windows Registry is a hierarchical database that holds information pertaining to the operating system such as the computer’s hardware, software, and user preferences. In other words, the Registry is used by the operating system and applications to store configuration data. The Registry key structure resembles a file system directory tree in which each node may contain a value or another subkey.

The Registry is divided into five main sections: HKEY_LOCAL_MACHINE, HKEY_CURRENT_CONFIG, HKEY_CLASSES_ROOT, HKEY_USERS, and HKEY_CURRENT_USER. Each section contains different types of data.

  • HKEY_CLASSES_ROOT: Stores information about registered applications, including file associations and OLE object class definitions.
  • HKEY_CURRENT_USER: Stores settings for the current user. This is where most application settings are stored.
  • HKEY_LOCAL_MACHINE: Stores settings that apply to all users on the machine, such as installed applications and device drivers.
  • HKEY_USERS: Stores settings for all users on the machine. This is primarily used by system administrators.
  • HKEY_CURRENT_CONFIG: This contains information related to the current hardware configuration. This is primarily used by system administrators.

Getting started with the Registry in C#

The C# programming language provides support for working with the Windows Registry through the Microsoft.Win32 namespace. The Registry class is the main entry point for interacting with the registry. It contains static methods for reading and writing to the registry, as well as a static property that gives access to a RegistryKey object representing the current user’s profile. The RegistryKey class in this namespace can be used to create, open, and close keys in the Registry.

You can add, edit, and delete keys and subkeys in C#. You can also read, add, and delete values from the registry. Analogous to a folder and subfolders inside a folder, a registry can have keys and subkeys.

Read: Project Management Software for .NET Developers

How to Retrieve a Value from the Registry in C#

To retrieve a value from the Registry, you can use the GetValue method of the Registry class. This method accepts two parameters: the key path and the value name. A key path represents the path to the key that holds the value you want to retrieve.

Here is an example of how to use GetValue to retrieve a value in C#:

string keyPath = @"HKEY_CURRENT_USER\MyTestKey"; 
string valueName = "MyTestValue"; 
object testValue = Registry.GetValue(keyPath, valueName, null);

Here, we are retrieving the value named “MyTestValue” from the key named MyTestKey.

How Do I Add Data to the Registry in C#?

To add a new Registry key and value, developers can use the following C# code:

Registry.SetValue("HKEY_CURRENT_USER\\TestApp", "TestKey", "TestValue");

To create a new subkey, use the CreateSubKey method of the Microsoft.Win32.Registry class. For example, to create a new key called “TestKey” under the “HKEY_CURRENT_USER” key, you would use the following C# code:

RegistryKey registryKey = Registry.CurrentUser.CreateSubKey("TestKey");

The RegistryKey class represents a key in the registry. It can be used to create new keys, or open existing ones. Once a key is opened, its values can be read and written using the GetValue and SetValue methods. The following code snippet illustrates how you can leverage the CreateSubKey method to create a subkey and then add data into it with C#:

RegistryKey registryKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\TestSubKey");
registryKey.SetValue("Key_A", "Value A");
registryKey.SetValue("Key_B", "Value B");              

To delete a key, use the DeleteSubKey method. This will delete a key and all of its subkeys. For example, to delete the “TestKey” key, you would use the following code:

Registry.CurrentUser.DeleteSubKey("TestKey");

To delete a registry key and its subkey tree you can use the following code:

Registry.CurrentUser.DeleteSubKeyTree("TestApp");

Read: C# Tools for Code Quality

How Do I Retrieve Data from the Registry in C#?

Programmers can take advantage of the RegistryKey class to retrieve data from the Windows Registry. We can also use this class to create, open, or delete keys, to enumerate subkeys, and to access values in the key. To open an existing key, we use the OpenBaseKey method:

RegistryKey key = Registry.OpenBaseKey(RegistryHive.LocalMachine, "SOFTWARE\\KeyA\\KeyB");

How Do I Remove Data from the Registry in C#?

To remove data from the registry, you can leverage the RegistryKey.DeleteValue() method. To use this method, you will need to pass in the name of the value that you want to delete. For example, to delete a value named “TestValue”, you would use the following code:

using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("TestKey", true))
{
    if (registryKey == null)
    {
        // The key doesn't exist in the registry.
        // Hence, write your code to handle the error here.
    }
    else
    {
        registryKey.DeleteValue("TestValue");
    }
}

This will delete the specified value from the Registry.

How to Backup and Restore the Registry in C#

To back up the Windows Registry, you have two choices: using the Registry class or the WINREG API.

We will use the Registry class here. To back up the registry, you can use the ExportRegistryTree method. This method takes two parameters: the key to export and the file name to export to. The following code snippet illustrates how it can be used:

Registry.ExportRegistryTree(Registry.LocalMachine, "backup.reg");

This will export the entire registry to the backup.reg file. You can also specify a specific key to export, as shown in the code snippet given below:

Registry.ExportRegistryTree(Registry.CurrentUser, "backup.reg");

To restore the registry that was backed up previously, you can use the following code snippet:

Registry.ImportRegistryFile("backup.reg", true);

This will import the entire registry from the backup.reg file, overwriting any existing keys. You can also specify a specific key to import, like this:

Registry.ImportRegistryFile("backup.reg", Registry.CurrentUser, true);

This will import the entire registry from the backup.reg file, overwriting any existing keys.

Final Thoughts on Windows Registry Programming in C#

In this C# programming tutorial, we have looked at how to create, open, and close keys as well as how to read and write values. Just be sure to take care when working with Registry keys and values, as accidental deletion or modification can lead to serious problems on your computer running the Windows operating system.

Read more C# programming and software development tutorials.

Joydip Kanjilal
Joydip Kanjilal
A Microsoft Most Valuable Professional in ASP.NET, Speaker, and Author of several books and articles. More than 25 years of experience in IT with more than 18 years in Microsoft .NET and its related technologies. He was selected as a Community Credit Winner at http://www.community-credit.com several times. He has authored 8 books and more than 500 articles in some of the most reputed sites worldwide including MSDN, Info World, CodeMag, Tech Beacon, Tech Target, Developer, CodeGuru, and more.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read