使用.NET访问Windows注册表?

6 .net registry 64-bit 32-bit

我发现一个奇怪的行为,.NET模块使用RegistryKey类访问Windows注册表.

例如,我编写了一个访问注册表的.NET模块testcom.dll.此testcom.dll文件由本机32位应用程序和64位应用程序使用.我的要求是获取一个regkey的值(路径HKEY_LOCAL_MACHINE\SOFTWARE\Test\MyParameters和密钥名称Age).这个"Age"密钥将在32位计算机上使用32位注册表,在64位计算机上使用64位注册表(不是WOW64).

在64位计算机上,当32位应用程序使用testcom.dll时,将在WOW64注册表中搜索密钥"Age".当64位应用程序使用testcom.dll时,将在64位注册表中搜索密钥"Age".

我的要求是在64位计算机上读取64位注册表中的密钥,无论应用程序使用testcom.dll文件.我怎样才能做到这一点?

woa*_*any 9

如果您可以将目标.Net版本更改为v4,那么您可以使用新的OpenBaseKey函数,例如

RegistryKey registryKey;
if (Environment.Is64BitOperatingSystem == true)
{
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
}
else
{
    registryKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
}
Run Code Online (Sandbox Code Playgroud)


Rhy*_*ous 5

我对此进行了广泛的研究,发现在.NET 4中使用托管代码可以轻松处理,但在.NET 4之前,您必须加载DLLIMport advapi32.dll.

这是我的研究.

http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32-bit-application-or-vice-versa/


Bla*_*rad 4

我遇到了类似的问题,我发现的最佳答案是退回到 Win32 注册表函数(例如RegOpenKeyEx)并传入适当的注册表项安全性和访问权限,特别是将samDesired参数与KEY_WOW64_64KEY.

这太糟糕了,我希望你在这里听到更好的答案。