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

前端 未结 3 844
抹茶落季
抹茶落季 2021-01-11 18:53

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 s

相关标签:
3条回答
  • 2021-01-11 19:12

    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();
        }
    
    0 讨论(0)
  • 2021-01-11 19:18

    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 讨论(0)
  • 2021-01-11 19:20

    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");
    
    0 讨论(0)
提交回复
热议问题