2014-03-13 22 views
0

我正在运行为AnyCPU编译的C#应用​​程序。它访问注册表键并获得它们的价值。如果密钥不存在,它将使用默认值创建它。我正在使用函数Registry.LocalMachine.CreateSubKey(strRegistryPath)来执行此操作,其中strRegistryPath是\ SOFTWARE \ MyAppln。密钥在32位机器上的HKLM \ SOFTWARE \ MyAppln中创建并正常工作。但是,当我尝试在64位机器上使用相同的程序时,这些键将在HKLM \ SOFTWARE \ Wow6432Node \ MyAppln中创建。由于这个原因,我无法正确读取这个值。如何让我的应用程序访问注册表项,而不管它的3​​2位或64位?

如何使我的程序在32位和64位机器上都能工作?

+0

你*不*实际编译您的程序为AnyCPU。平台的名称与抖动是否强制以32位模式运行没有任何关系。重要的*真实*设置是项目+属性,生成选项卡,平台目标设置。如果您看到“首选32位”选项,请将其关闭。重复发布配置。 –

+0

我使平台目标为AnyCPU。我看不到任何首选的32位选项。发布配置我没有得到你。仍然没有工作。 @HansPassant –

+0

什么是“仍然无法使用?”请定义“不工作”。我敢肯定,我给你的答案允许你从32位进程写入64位视图,如果这是你想要的。然而,人们不禁要问,为什么你非常关心从32位进程写入32位视图。如果你的进程是32位,那么32位视图可能是写作的地方? –

回答

1

如果您想在HKLM\Software下创建密钥,那么您将受制于registry redirector。如果要编写相同的位置,而不考虑代码是32位还是64位,则必须选择一个注册表视图,并始终在该位置写入。选择32位视图或64位视图,这并不重要。

一旦您开始思考,请使用RegistryView枚举来强制使用您选择的注册表视图。请注意,在32位系统上,只有一个注册表视图,因此您使用的值RegistryView将被忽略。

例如,如果您使用RegistryView.Registry64打开密钥,那么您的密钥将永远不会出现在Wow6432Node(WOW64重定向下的32位视图)下。你可以在32位系统上很好地使用RegistryView.Registry64,它只是被忽略。

你也应该知道你的程序需要升级,因为它写入HKLM。这可能会对用户产生不利影响。

+0

我正在使用** Createsubkey()**函数和_Registryview_ enum用于** openremotebasekey()**函数。那我该怎么做呢?你能告诉如何修改或使用它吗? @David –

+0

请按照RegistryView枚举文档的答案中的文档链接。它告诉你使用OpenBaseKey。 –

相关问题