C# 注册表项已删除,但仍从注册表c获取值#
我创建了windows应用程序。当我通过代码创建注册表值时,它运行良好,但从注册表中删除后(我使用regedit从cmd中删除该注册表)。当我从VisualStudio调试时,仍然在代码中显示该值 我的注册表创建代码C# 注册表项已删除,但仍从注册表c获取值#,c#,.net,winforms,registry,C#,.net,Winforms,Registry,我创建了windows应用程序。当我通过代码创建注册表值时,它运行良好,但从注册表中删除后(我使用regedit从cmd中删除该注册表)。当我从VisualStudio调试时,仍然在代码中显示该值 我的注册表创建代码 RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\TOPO"); if (key != null) { //key.SetValue("interval", "5000"); key.SetV
RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\TOPO");
if (key != null)
{
//key.SetValue("interval", "5000");
key.SetValue("Topos", 1, RegistryValueKind.DWord);
key.Close();
}
然后我检查Program.cs中的值
string strval = string.Empty;
RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\TOPO");
if (key != null)
{
//key.SetValue("interval", "5000");
bb = Convert.ToInt32(key.GetValue("Topos"));
key.Close();
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (bb == 1)
{
Application.Run(new frm_mdi());
}
else
{
Application.Run(new frm_activation());
}
在Windows XP和更新版本中,某些注册表项在32位和64位进程之间被重定向、反射或共享。特别是
HKLM\Software\TOPO
应该重定向到HKLM\Software\WOW6432Node\TOPO
,根据。更多关于重定向的信息。
因此,当您使用Regedit(64位)从注册表中删除项时,该项的32位版本仍保留在注册表中
解决方案
选项1
如果可能,让您的应用程序在64位Windows上作为64位进程运行。假设您使用的是Visual Studio,并且您的应用程序针对任何CPU解决方案平台,您可以通过右键单击project->Properties->Build选项卡并取消选中所有所需配置的“Preference 32-bit”复选框来实现这一点
选项2
修改您的程序,以访问64位版本的注册表,即使它作为32位进程运行。您可以通过以下方式执行此操作:
var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
.OpenSubKey(@"SOFTWARE\TOPO");
如果您需要更多详细信息,请参阅答案
选项3
使用regedit删除/修改/创建注册表时,只需编辑
HKLM\Software\WOW6432Node\TOPO
键,而不是在Windows XP和更新版本中编辑HKLM\Software\TOPO
,,某些注册表键会在32位和64位进程之间重定向、反射或共享。特别是HKLM\Software\TOPO
应该重定向到HKLM\Software\WOW6432Node\TOPO
,根据。更多关于重定向的信息。
因此,当您使用Regedit(64位)从注册表中删除项时,该项的32位版本仍保留在注册表中
解决方案
选项1
如果可能,让您的应用程序在64位Windows上作为64位进程运行。假设您使用的是Visual Studio,并且您的应用程序针对任何CPU解决方案平台,您可以通过右键单击project->Properties->Build选项卡并取消选中所有所需配置的“Preference 32-bit”复选框来实现这一点
选项2
修改您的程序,以访问64位版本的注册表,即使它作为32位进程运行。您可以通过以下方式执行此操作:
var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
.OpenSubKey(@"SOFTWARE\TOPO");
如果您需要更多详细信息,请参阅答案
选项3
使用regedit删除/修改/创建注册表时,只需编辑
HKLM\Software\WOW6432Node\TOPO
项,而不是HKLM\Software\TOPO
,我遇到了类似的问题,在我的例子中,我发现还有一种注册表项重定向到基于VSTO的Office加载项。如果使用new Click来运行Office安装,并从Office加载项中保存/读取注册表项,它可能会被重定向到另一个位置,如:HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\registry\MACHINE\SOFTWARE\TOPO
我遇到了类似的问题,在我的情况下,我发现还有一种注册表项重定向基于VSTO的Office加载项。如果使用“新建单击”运行Office安装,并从Office加载项中保存/读取注册表项,它可能会重定向到另一个位置,如:HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\registry\MACHINE\SOFTWARE\TOPO
以x86或x64运行?在64位计算机上?看起来您每次运行程序时都在创建密钥,因此,即使手动删除并再次运行该程序,它仍然存在。显示的值是多少?执行CreateSubKey
,每次都会重新创建密钥。如果值不存在,GetValue
不会引发异常,而是返回null
,该值将由Convert.ToInt32()
转换为0
。如果您的程序在64位操作系统上以32位进程运行,您的程序实际上可能从HKLM\Software\WOW6432Node\TOPO
读取值,而不是从HKLM\Software\TOPO
读取值,因为从注册表读取的值是由WOW64层重定向的-请参阅@Ňuf是的,您将其存储键更正为WOW64,请告诉我现在必须在代码中做哪些更改?以x86或x64运行?在64位计算机上?看起来您每次运行程序时都在创建密钥,因此,即使手动删除并再次运行该程序,它仍然存在。显示的值是多少?执行CreateSubKey
,每次都会重新创建密钥。如果值不存在,GetValue
不会引发异常,而是返回null
,该值将由Convert.ToInt32()
转换为0
。如果您的程序在64位操作系统上以32位进程运行,您的程序实际上可能从HKLM\Software\WOW6432Node\TOPO
读取值,而不是从HKLM\Software\TOPO
读取值,因为从注册表读取的值是由WOW64层重定向的-请参阅@Ňuf是的,您将其存储键更正为WOW64,请告诉我现在必须在代码中进行哪些更改?