我发现一个奇怪的行为,.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文件.我怎样才能做到这一点?
如果您可以将目标.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)
我对此进行了广泛的研究,发现在.NET 4中使用托管代码可以轻松处理,但在.NET 4之前,您必须加载DLLIMport advapi32.dll.
这是我的研究.
我遇到了类似的问题,我发现的最佳答案是退回到 Win32 注册表函数(例如RegOpenKeyEx)并传入适当的注册表项安全性和访问权限,特别是将samDesired参数与KEY_WOW64_64KEY.
这太糟糕了,我希望你在这里听到更好的答案。
| 归档时间: |
|
| 查看次数: |
7009 次 |
| 最近记录: |