开发者

C# Reading the registry: ProductID returns null in x86 targeted app. "Any CPU" works fine

I have recently moved to a W7 64bit machine with VS 2010. My project is set to run on Any CPU. When I change this to be targeted at x86 I noticed some of my registry calls no longer work.

I am trying to read the ProductID field like so:

RegistryKey windowsNTKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
object productID 开发者_开发技巧= windowsNTKey.GetValue("ProductId");

productID is always null when running in x86 mode, when running in "Any CPU" it works correctly. What is going on here?


Some registry keys are redirected by WOW64. More information on this topic is available on MSDN http://msdn.microsoft.com/en-us/library/aa384232(v=vs.85).aspx

If you really want to always access the x64 node (.Net4) :

  RegistryKey localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
  RegistryKey windowsNTKey = localMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
  object productID = windowsNTKey.GetValue("ProductId");


This code will get the id for all kinds of os architectures and program architectures. Could be written shorter but I like the readability

    static string GetProductId()
    {
        RegistryKey localMachine = null;
        if (Environment.Is64BitOperatingSystem)
        {
            localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        }
        else
        {
            localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
        }
        RegistryKey windowsNTKey = localMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
        return windowsNTKey.GetValue("ProductId").ToString();
    }


On win64 some registry keys of 32-bit application are stored in Software\Wow6432Node subkey.

If you want to switch into 64 bit key you can use RegistryView enum as parameter of RegistryKey.OpenBaseKey

Personally to make code working always in main registry key (not WoW6432) im using such construction:

RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜