◆ フォルダ = key
◆ エントリ = value
◆ value の読み書きだけなら単純に key, name, value の指定でできる
◆ key の作成や key, value の削除・一覧取得になると RegistryKey の操作が必要になる

key と value

レジストリの key と value はちょっと変わってます
JSON みたいに key に対してひとつ value があるものとは違います

レジストリエディタのそれぞれのフォルダのパスのことが key と呼ばれます
フォルダを指定したときに右側に出てくるファイル一覧のような部分のそれぞれが value と呼ばれます
ファイル名のことは name (value name) になります

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName
なら

key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

name:
ProductName

value:
Windows 10 Pro

という感じです

value の読み書き

key と name の 2 つにわけて指定することになります
一見フォルダとファイルなのにちょっとわかりづらいです

なのでファイルの読み書き風にできるようにしてみました
private static string getRegistryValue(string path)
{
var key = Path.GetDirectoryName(path);
var valuename = Path.GetFileName(path);
return Registry.GetValue(key, valuename, null)?.ToString();
}

public static void setRegistryValue(string path, object value)
{
var key = Path.GetDirectoryName(path);
var valuename = Path.GetFileName(path);
Registry.SetValue(key, valuename, value);
}

Console.WriteLine(getRegistryValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName"));
// Windows 10 Pro

setRegistryValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont\932.1", "meiryoke_console");

regtest01

読み取りなら問題ないですが 書き込みでは管理者でないと「アクセスが拒否されました」と例外が発生します

もっと複雑な操作

value の読み書きは簡単にできたのですが key を追加したり 削除したりするには RegistryKey を操作しないといけません
Registry.LocalMachine や Registry.CurrentUser が RegistryKey のインスタンスです
それらを元に OpenSubKey メソッドで目的のキーを開いて キーに対して CreateSubKey や DeleteSubKey などを行います

試しに適当にやってみます
> using Microsoft.Win32;
> var key = Registry.ClassesRoot.CreateSubKey("TEST", true);
> key
[HKEY_CLASSES_ROOT\TEST]
> var key2 = key.CreateSubKey("SUBTEST", true);
> key2.CreateSubKey("TEST01");
> key2.CreateSubKey("TEST02");
> key2.CreateSubKey("TEST03");
> key2.SetValue("NAME01", "VALUE01");
> key2.SetValue("NAME02", "VALUE02");
> key2.ValueCount
2
> key2.SubKeyCount
3
> key2.DeleteValue("NAME01");
> key2.DeleteSubKey("TEST01");

HKEY_CLASSES_ROOT に TEST という key を作って その中に SUBTEST というキーを作りました
そこに TEST01 ~ TEST03 の key と NAME01 と NAME02 の value を作りました

ValueCount と SubKeyCount でちゃんとカウントが取れてます

その後 NAME01 と TEST01 を削除しました
この状態をレジストリエディタで見るとこうなってました

regtest02

直接ルートの HKEY_CLASSES_ROOT から subkey を作り始めたので OpenSubKey を使ってなかったので使ってみます
> var key22 = Registry.ClassesRoot.OpenSubKey(@"TEST\SUBTEST");
> key22.GetValueNames()
string[1] { "NAME02" }
> key22.GetSubKeyNames()
string[2] { "TEST02", "TEST03" }
> Registry.ClassesRoot.DeleteSubKeyTree("TEST");

OpenSubKey では一階層ずつ開く必要はなくパス形式の指定で一気に深い階層を開けます
ValueNames と SubKeyNames を確認してもちゃんと開けてることがわかります

最後に TEST 以下のツリー全体を消してテスト用に作ったものを全部消しています
レジストリエディタからも完全に消えました

regtest03