4

我想在下面的注册表路径中为“NoModify”设置一个值。“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XXXX”

我正在使用下面的代码,它仅适用于 X86 机器。你能看出为什么这不适用于 x64 机器吗?

// This value is correct
RegistryView registryView = releaseFlags.Contains("PLATFORM_X86") ? RegistryView.Registry64 : RegistryView.Registry32;

    using (RegistryKey hkeyLocalMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
    {
        RegistryKey noModifyKey = hkeyLocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{xxxx}", true); //SL: Key Name

        if (noModifyKey != null)
        {
            noModifyKey.SetValue("NoModify", 0);
            noModifyKey.Flush();
        }
    }
4

4 回答 4

1

当您在 64 位机器上并且您的应用程序是 32 位时 - 它应该将这些设置存储在 HKLM\Software\WOW6432Node 而不是 HKLM\Software\ 节点中。

于 2012-11-12T02:21:52.097 回答
1

只要您编译您的 .NET 程序,您将在任何x86情况AnyCPU下使用适用于 x86 的“正确”注册表项,因为它将作为 x86 运行。

如果将其编译为x64or AnyCPU,则可能会非常棘手,因为它可能会在 x64 机器上以 x64 运行,并使用HKLM\SOFTWAREx86 程序实际 HKLM\SOFTWARE\WOW6432Node所在的“错误”注册表。

于 2012-11-12T02:24:09.837 回答
1

这是我在代码中的错误。

RegistryView registryView = releaseFlags.Contains("PLATFORM_X86") ? RegistryView.Registry64 : RegistryView.Registry32;

应该如下:

RegistryView registryView = releaseFlags.Contains("PLATFORM_X86") ? RegistryView.Registry32 : RegistryView.Registry64;
于 2012-11-12T23:01:30.907 回答
1

您应该以这种方式打开基本密钥。
这个对我有用。

var rk = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
    if (Environment.Is64BitOperatingSystem) {
        rk = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        var val = rk.OpenSubKey("SOFTWARE\\Pourab\\sanjande", true);
    
        val.SetValue("test", "testvalue");
    }
于 2020-10-05T05:20:36.477 回答