c# - Is this a good way to determine OS Architecture?


Translate

Since the WMI class Win32_OperatingSystem only includes OSArchitecture in Windows Vista, I quickly wrote up a method using the registry to try and determine whether or not the current system is a 32 or 64bit system.

private Boolean is64BitOperatingSystem()
{
    RegistryKey localEnvironment = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
    String processorArchitecture = (String) localEnvironment.GetValue("PROCESSOR_ARCHITECTURE");

    if (processorArchitecture.Equals("x86")) {
        return false;
    }
    else {
        return true;
    }
}

It's worked out pretty well for us so far, but I'm not sure how much I like looking through the registry. Is this a pretty standard practice or is there a better method?

Edit: Wow, that code looks a lot prettier in the preview. I'll consider linking to a pastebin or something, next time.


Всички отговори
  • Translate

    Take a look at Raymond Chens solution:

    How to detect programmatically whether you are running on 64-bit Windows

    and here's the PINVOKE for .NET:

    IsWow64Process (kernel32)

    Update: I'd take issue with checking for 'x86'. Who's to say what intel's or AMD's next 32 bit processor may be designated as. The probability is low but it is a risk. You should ask the OS to determine this via the correct API's, not by querying what could be a OS version/platform specific value that may be considered opaque to the outside world. Ask yourself the questions, 1 - is the registry entry concerned properly documented by MS, 2 - If it is do they provide a definitive list of possible values that is guaranteed to permit you as a developer to make the informed decision between whether you are running 32 bit or 64 bit. If the answer is no, then call the API's, yeah it's a but more long winded but it is documented and definitive.


  • Translate

    The easiest way to test for 64-bit under .NET is to check the value of IntPtr.Size.

    I believe the value of IntPtr.Size is 4 for a 32bit app that's running under WOW, isn't it?

    Edit: @Edit: Yeah. :)


  • Translate

    The easiest way to test for 64-bit under .NET is to check the value of IntPtr.Size.

    EDIT: Doh! This will tell you whether or not the current process is 64-bit, not the OS as a whole. Sorry!


  • Translate

    Looking into the registry is perfectly valid, so long as you can be sure that the user of the application will always have access to what you need.