Detekcja x86/x64 na platformie .NET?

Aplikacja oparta o .NET 3.5 jest kompilowana najczęściej na platformę neutralną (wszystko jedno czy jest to x86, czy x64) jak sprawdzić czy po uruchomieniu działa jako aplikacja x86, czy x64?

  • Do tego celu użyłbym WMI. Trzeba dodać referencję do System.Management i dopisać kod:

            ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
            object o = Mo["Architecture"];
            UInt16 sp = (UInt16)(o);
    
            if (sp == 0)
            {
                MessageBox.Show("x86");
            }
            else if (sp == 9)
            {
                MessageBox.Show("x64");
            }
    
            Mo.Dispose();
    

    Tutaj dostępne są różne architektury procesora jakie można rozpoznać.

    Update. Problem jednak nie jest tak prosty jak przedstawiam to ja i halish. Jeżeli potrzebujesz kompletne rozwiązanie odsyłam tutaj.

    Autorem poniższego kodu-rozwiązania jest Bruno Lopes (z powyższego linku):

       [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);
    
        private bool Is64Bit()
        {
            if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
        private bool Is32BitProcessOn64BitProcessor()
        {
            bool retVal;
    
            IsWow64Process(Process.GetCurrentProcess().Handle, out retVal);
    
            return retVal;
        }
    

  • IntPtr.Size da ci rozmiar inta, który wynosi 8, jesli maszyna jest 64-bit, lub 4, jeśli 32-bit.

    http://msdn.microsoft.com/en-us/library/system.intptr.size.aspx

  • Wprawdzie pytałem się o .NET 3.5, ale znalazłem (tak w ramach ciekawostki i informacji na przyszłość), że problem ten jest bardzo prosty do rozwiązania na platformie .NET 4.0. Klasa Environment została rozszerzona o nowe właściwości:

    • Environment.Is64BitOperatingSystem - zwraca prawdę, gdy wywołanie ma miejsce pod 64-bitowym systemem operacyjnym

    • Environment.Is64BitProcess - zwraca prawdę w przypadku, gdy proces jest 64bitowy.

    pzdr,

    Maciek

    http://maciej-progtech.blogspot.com/

Zaloguj się, aby dodać swoją odpowiedź