C#在64位操作系统上读取错误的注册表数据

C#在64位操作系统上读取错误的注册表数据,c#,registry,64-bit,C#,Registry,64 Bit,我在64位Windows上工作,我的应用程序以提升的权限运行。我对以下非常简单的代码有一个问题: myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); if (myKey != null) { string[] HKLMvaluenames = myKey.GetValueNames(); } 但由于某些原因,HKLMvaluenam

我在64位Windows上工作,我的应用程序以提升的权限运行。我对以下非常简单的代码有一个问题:

myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
    if (myKey != null)
    {
    string[] HKLMvaluenames = myKey.GetValueNames();
    }
但由于某些原因,HKLMvaluenames数组填充了来自以下键的值:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

有办法解决这个问题吗?

这是出于设计考虑,32位程序对注册表的看法与64位程序不同。当它们尝试从HKLM\Software配置单元读取值时,会重定向到HKLM\Software\WOW6432节点键。如果您使用Project+属性、build选项卡、Platform Target=任何CPU构建C#程序,那么它将作为64位程序运行,并且不会被重定向

32位程序可以取消重定向,但使用.NET RegistryKey类很难做到这一点。P/需要使用KEY_WOW64_64KEY选项调用RegOpenKeyEx。更多信息可在此网站上找到



编辑:现在.NET也可以使用.NET 4特定的RegistryKey.OpenBaseKey()方法使用此选项。传递RegistryView.Registry64以像64位进程那样查看注册表。

当我遇到这个问题的原因的相同问题或相同焦点时,我找到了一个解决方案

使用以下命令:

//To set the Base to the right path set RegistryView to DEFAULT, Registry64 or Registry32 regarding the path you need. If you want to go over the x64 root:

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
        .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
现在它会按照你想要的方式运行


玩得开心

由于外部/非托管依赖关系或其他原因,您的代码是否必须以32位模式运行?您的应用程序是否编译为32位应用程序?Wow64是64位windows OSs的32位兼容层。@尼克:我不必在32位上运行,但我希望我的应用程序也能在32位操作系统上运行(这非常重要)@是的,我知道wow64是什么。我的应用程序是使用VX2010 Express编译的,所以我想我甚至不能选择它的编译方式。我能在什么地方查一下吗?