C#Reg#U二进制和批处理

C#Reg#U二进制和批处理,c#,winforms,batch-file,C#,Winforms,Batch File,我是批处理迷,我试图用C#winForms而不是批处理来实现我的密钥 我制作了一个简单的批处理脚本: @echo off reg add "HKEY_CURRENT_USER\Software\TestProgram\Kool" /f /v "Setting" /t REG_BINARY /d h4h999d27e93f3666188231a018c9d44406136wb 1>nul 2>&1 更新了我的注册码,不用担心。然而,我想尝试用C#WinForms实现相同的结果

我是批处理迷,我试图用C#winForms而不是批处理来实现我的密钥

我制作了一个简单的批处理脚本:

@echo off
reg add "HKEY_CURRENT_USER\Software\TestProgram\Kool" /f /v "Setting" /t REG_BINARY /d h4h999d27e93f3666188231a018c9d44406136wb 1>nul 2>&1
更新了我的注册码,不用担心。然而,我想尝试用C#WinForms实现相同的结果,我相信我有正确的公式,但结果不正确

我尝试了以下操作(在首先检查reg_二进制文件是否存在并删除它之后):

这使得密钥不必担心,但它的格式或结果与我通过批处理得到的不同,有人能向我解释为什么吗?我所追求的结果与使用批处理文件时的结果相同

我觉得我错过了一些简单的东西,也许是不正确的字节,我就是想不出来

我已经阅读了以下帮助:


但是仍然没有成功。

要创建二进制密钥,需要传递一个
字节[]
。因此,您应该首先将十六进制字符串转换为字节数组,然后添加值

例如:

var path = @"Software\TestProgram\Kool";
var key = Registry.CurrentUser.OpenSubKey(path, true);
if (key == null)
    key = Registry.CurrentUser.CreateSubKey(path, true);
var hex = "d5d000d27e93f3116100224a018c9d00406136c3";
var value = StringToByteArray(hex);
key.SetValue("Setting", value, RegistryValueKind.Binary);
我使用了JaredPar共享的
StringToByteArray
方法:


h4h999d27e93f3666188231a018c9d44406136wb
不是有效的十六进制值。那么,是否有任何原因可以解释为什么它在不转换十六进制值的情况下批量工作?它的同类批自动将十六进制转换为字节。
D5D000D27E93F31161100224A018C9D00406136C3
将被reg add命令视为十六进制值。但这里是C#您需要将其作为
字节[]
传递。
var path = @"Software\TestProgram\Kool";
var key = Registry.CurrentUser.OpenSubKey(path, true);
if (key == null)
    key = Registry.CurrentUser.CreateSubKey(path, true);
var hex = "d5d000d27e93f3116100224a018c9d00406136c3";
var value = StringToByteArray(hex);
key.SetValue("Setting", value, RegistryValueKind.Binary);
public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}