SetValue 64位机器注册表

时间:2012-11-12 02:16:44

标签: c# .net installer registry 64-bit

我想在下面的注册表路径中为'NoModify'设置一个值。 “HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\ 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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您将.NET程序编译为x86而不是AnyCPU,则在任何情况下都将使用适用于x86的“正确”注册表项,因为它将作为x86运行。< / p>

如果您将其编译为x64AnyCPU,它可能会非常棘手,因为它可能在x64计算机上以x64身份运行,并使用HKLM\SOFTWARE处的“错误”注册表x86程序实际上是 HKLM\SOFTWARE\WOW6432Node

答案 2 :(得分:0)

这是我在代码中的错误。

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

应如下:

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

答案 3 :(得分:0)

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

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");
    }