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.