Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 注册表项已删除,但仍从注册表c获取值#_C#_.net_Winforms_Registry - Fatal编程技术网

C# 注册表项已删除,但仍从注册表c获取值#

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

我创建了windows应用程序。当我通过代码创建注册表值时,它运行良好,但从注册表中删除后(我使用regedit从cmd中删除该注册表)。当我从VisualStudio调试时,仍然在代码中显示该值

我的注册表创建代码

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,请告诉我现在必须在代码中进行哪些更改?