Przy okazji przygotowywania sobie materiałów do kolejnego postu natrafiłem na program, który wymagał ode mnie uzyskania
informacji ilo-bitowy mamy procesor oraz czy uruchamiany kod jest na systemie 32 czy 64-bitowym.
Rozpocząłem poszukiwania i ten post jest ich wynikiem?
Procesor
Zmienne systemowa
Po uruchomieniu polecenia SET w konsoli naszym oczom ukazuje lista zmiennych systemowych a wsród nich widnieje PROCESSOR_ARCHITECTURE.
Tak więc pierwszą i najgorszą metodą jest wywołanie poniższego kodu:
public static bool Is64Bit
{
get
{
return Environment.GetEnvironmentVariable(“Processor_Architecture”)
== “AMD64”;
}
}
Tak jak napisałem jest to najgorsza metoda z racji, iż zmienna taka może zostać zmieniona na cokolwiek (także z uwagi na to, że wartość ta jest pewnie różna w zależności od procesora – a może nie??)
WMI
Kiedyś pisałem o możliwościach WMI i o tym jak wiele się tam informacji znajduje (WMI Wokół masz informacje). Nie inaczej jest z informacją o procesorze. Wystarczy, że uruchomimy poniższy kod.
public static bool Is64Bits
{
get
{
var query = new WqlObjectQuery(“select * from Win32_Processor”);
var searcher = new ManagementObjectSearcher(query);
foreach (var elem in searcher.Get())
{
var addressWidth =
Convert.ToInt32(elem.GetPropertyValue(“AddressWidth”));
return 64 == addressWidth;
}
return false;
}
}
The best & simplest way
Jednakże jest trzecie (w sumie możliwe że istnieje więcej) podejście. Wiadomo (a może nie), że w 64bitach przestrzeń adresowa jest rozszerzona do 8 bajtów (z 4 w 32bitach). Zatem jeżeli udałoby się sprawdzić rozmiar wskaźnika na pamięc i jeśli wynosiłby on 8 bajtów oznaczałoby to, że mamy 64bity. I jak się okazuje takie sprawdzenie jest dziecinnie proste.
public static bool Is64Bits
{
get
{
return IntPtr.Size == 8;
}
}
I to wszystko. Prosty warunek i gotowe.
System operacyjny
Niestety tu tylko jak na razie znam tylko metodę za pomocą WMI:
public static bool Is64OS
{
get
{
var query = new WqlObjectQuery(“select * from Win32_OperatingSystem”);
var searcher = new ManagementObjectSearcher(query);
foreach (var elem in searcher.Get())
{
var osArchitecture =
elem.GetPropertyValue(“OSArchitecture”);
return “64-bit”.CompareTo(osArchitecture) == 0;
}
return false;
}
}
Jeśli ktoś zna jeszcze inne metody, zachęcam do pozostawienia komentarza.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl