我想在下面的注册表路径中为'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();
}
}
答案 0 :(得分:1)
当您使用的是64位计算机并且您的应用程序是32位时 - 它应该将这些设置存储在HKLM \ Software \ WOW6432Node而不是HKLM \ Software \节点中。
答案 1 :(得分:1)
如果您将.NET程序编译为x86
而不是AnyCPU
,则在任何情况下都将使用适用于x86的“正确”注册表项,因为它将作为x86运行。< / p>
如果您将其编译为x64
或AnyCPU
,它可能会非常棘手,因为它可能在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");
}