C# 在WOW场景中,如何在没有WOW重定向的情况下写入HKLM?

C# 在WOW场景中,如何在没有WOW重定向的情况下写入HKLM?,c#,windows,registry,C#,Windows,Registry,我有一个魔兽世界的场景,想在 HKLM\Software\Microsoft\ABCD\ 我正在使用以下代码: String key = @"SOFTWARE\Microsoft\ABCD\"; RegistryKey reg64key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); RegistryKey reg_64bit_Name = reg64key.OpenSubKey(key

我有一个魔兽世界的场景,想在

HKLM\Software\Microsoft\ABCD\

我正在使用以下代码:

String key = @"SOFTWARE\Microsoft\ABCD\";
RegistryKey reg64key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey reg_64bit_Name = reg64key.OpenSubKey(key);
reg_64bit_Name.SetValue("Name","ahsan");
然而,这是行不通的。有人能建议我在这里做什么吗

注意: 1.不工作表示我在运行应用程序时遇到以下异常:

System.NullReferenceException: Object reference not set to an instance of an object.
首先,通过“这不起作用”,您能否描述任何错误消息、异常和编译器错误

也就是说你的代码

reg64key.SetValue("Key","ahsan");
您将看到您正在使用
“键”
(作为字符串)。尝试将此更改为

reg64key.SetValue(key,"ahsan");
因此,您使用的是变量,而不是字符串
“Key”

编辑:操作更改后

在你的编辑之后,我回去为自己尝试了这个。请参阅下面的代码(已测试)

您将从代码中看到,我们要做的第一件事是为
HKLM
获取
reg64键。接下来,我们检查
reg64key
是否不为null(不应为null,但您永远不知道)。接下来,我们使用
reg64键
打开键
“SOFTWARE\Microsoft\ABCD”
。如果找不到该键(
baseKey==null
),则创建该键

最后,您可以根据需要设置密钥


希望这能有所帮助。s

但是这不起作用。哦,真的吗?法兰支架坏了吗?也许小部件处理程序没有正确的接口?或者发生了其他错误?这是您的实际代码吗?如果是这样,您的问题可能是您正在写入名为“key”的键,而不是使用
key
变量。您顺便提到这是一个令人惊叹的场景,因此可能涉及注册表重定向。您还提到要避免WOW重定向,然后将
RegistryView.Registry64
传递给OpenBaseKey,然后一些返回值为null(您实际上还没有指定哪行代码获得null引用异常)。您在这里尝试做什么?为什么这是一个
WOW
场景?如果你提供一些有用的细节,也许有人能帮助你。@stuartd:我正试图改变一些价值观。本质上,我正在编写一些测试代码,需要在运行测试之前更改一些值。32位和64位本机工作正常。我需要魔兽世界场景正常工作。我已经描述了错误。另外,你提到的问题,虽然考虑周到,但这里的情况并非如此。谢谢。啊,我看到你编辑了这个问题。我已经编辑了答案。干杯。我看到这个错误:错误:System.UnauthorizedAccessException:无法写入注册表项。在Microsoft.Win32.RegistryKey.EnsureWriteable()的Microsoft.Win32.RegistryKey.SetValue(字符串名称、对象值、RegistryValueKind valueKind)的Microsoft.Win32.RegistryKey.SetValue的System.ThrowUAuthorizedAccessException(ExceptionResource resource)中检查应用程序编译。您可能正在尝试在32位应用程序上打开64位注册表。检查您是否在任何CPU上编译。感谢您的帮助,我在其他地方遇到了类似的问题,已修复。您的代码在获得只读句柄后试图更改值时出现问题,我也修复了您的代码。谢谢你的帮助:D
RegistryKey reg64key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
String key = @"SOFTWARE\Microsoft\ABCD";

if (reg64key == null)
    throw new Exception("reg64key");

var basekey = reg64key.OpenSubKey(key);
if (basekey == null)
    basekey = reg64key.CreateSubKey(key);

basekey.SetValue("Name", "ahsan");