Как проверить разрядность системы?

293
21 апреля 2017, 17:59

Имея данный алгоритм, почему-то большую часть показывает x32. У меня стоит x64

private static bool Is64Bit()
{
    return IntPtr.Size == 8;
}
public static string CheckOS()
{
    if (Is64Bit())
        return "x64";
    else
        return "x32";
}
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process([In] IntPtr hProcess, out bool lpSystemInfo);

Как нормально проверить на всех осях разрядность?

Answer 1

Начиная с 4 версии фреймворка существует простой способ проверить разрядность ОС, используя статический класс Environment и его свойство Is64BitOperatingSystem:

using System;
static string GetOSBit()
{
    if (Environment.Is64BitOperatingSystem)
        return "x64";
    else
        return "x32";
}

Console.WriteLine(GetOSBit());

Answer 2

Решил проблему так:

internal class OSCheckBit
{
    private static bool Is32BitProcessOn64BitProcessor()
    {
        IsWow64ProcessDelegate fnDelegate = GetIsWow64ProcessDelegate();
        if (fnDelegate == null)
            return false;
        bool isWow64;
        bool retVal = fnDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWow64);
        if (retVal == false)
            return false;
        return isWow64;
    }
    private static IsWow64ProcessDelegate GetIsWow64ProcessDelegate()
    {
        IntPtr handle = LoadLibrary("kernel32");
        if (handle != IntPtr.Zero)
        {
            IntPtr fnPtr = GetProcAddress(handle, "IsWow64Process");
            if (fnPtr != IntPtr.Zero)
                return (IsWow64ProcessDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)fnPtr, typeof(IsWow64ProcessDelegate));
        }
        return null;
    }
    public enum SoftwareArchitecture
    {
        Unknown = 0,
        x32 = 1,
        x64 = 2
    }
    static public SoftwareArchitecture OSBits
    {
        get
        {
            SoftwareArchitecture osbits = SoftwareArchitecture.Unknown;
            switch (IntPtr.Size * 8)
            {
                case 64: osbits = SoftwareArchitecture.x64; break;
                case 32: if (Is32BitProcessOn64BitProcessor())
                             osbits = SoftwareArchitecture.x64;
                    else
                        osbits = SoftwareArchitecture.x32;
                    break;
                default:
                    osbits = SoftwareArchitecture.Unknown;
                    break;
            }
            return osbits;
        }
    }
    [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    public extern static IntPtr LoadLibrary(string libraryName);
    [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    public extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName);
    private delegate bool IsWow64ProcessDelegate([In] IntPtr handle, [Out] out bool isWow64Process);

Вызов: Console.WriteLine($"Версия Вашей ОС: {OSCheckBit.OSBits}");

READ ALSO
Переход с 1 на 2-ую сцену (Unity)

Переход с 1 на 2-ую сцену (Unity)

Пытаюсь сделать игру на Android, при клике по кнопке для перехода на другую сцену выдает ошибку:

462
Android Studio или Xamarin?

Android Studio или Xamarin?

Около года работаю в Android Studio, а совсем недавно узнал что есть такая программа - XamarinВ данной программе можно писать одновременно для Android,...

347
Навсегда скрыть panel при нажатии на button

Навсегда скрыть panel при нажатии на button

При запуске программы появляется panel1Нужно чтобы если пользователь нажмет на button1, панель не появится до следующих запусков программы

277