Reputation: 4455
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.
Upvotes: 22
Views: 6055
Reputation: 119856
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:
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.
Upvotes: 8
Reputation: 4455
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. :)
Upvotes: 2
Reputation: 17804
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.
Upvotes: 1
Reputation: 20916
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!
Upvotes: 1