Как программно определить, является ли конкретный процесс 32-битным или 64-битным

Как мое приложение C # может проверить, работает ли конкретное приложение / процесс (примечание: не текущий процесс) в 32-битном или 64-битном режиме?

Например, мне может потребоваться запросить конкретный процесс по имени, например, «abc.exe», или на основе идентификационного номера процесса.


person satya    schedule 23.12.2009    source источник
comment
Пожалуйста, всегда указывайте язык как тег; Я изменю это сейчас в этом посте. :-)   -  person Dean J    schedule 23.12.2009
comment
Уточните, хотите ли вы знать, что текущий процесс 64-битный, или вы запрашиваете другой процесс?   -  person mmx    schedule 23.12.2009
comment
Двойное копирование: stackoverflow.com/questions/266082/   -  person Lawrence Johnston    schedule 23.12.2009


Ответы (7)


Я видел один из наиболее интересных способов:

if (IntPtr.Size == 4)
{
    // 32-bit
}
else if (IntPtr.Size == 8)
{
    // 64-bit
}
else
{
    // The future is now!
}

Чтобы узнать, запущены ли ДРУГИЕ процессы в 64-битном эмуляторе (WOW64), используйте этот код:

namespace Is64Bit
{
    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    internal static class Program
    {
        private static void Main()
        {
            foreach (var p in Process.GetProcesses())
            {
                try
                {
                    Console.WriteLine(p.ProcessName + " is " + (p.IsWin64Emulator() ? string.Empty : "not ") + "32-bit");
                }
                catch (Win32Exception ex)
                {
                    if (ex.NativeErrorCode != 0x00000005)
                    {
                        throw;
                    }
                }
            }

            Console.ReadLine();
        }

        private static bool IsWin64Emulator(this Process process)
        {
            if ((Environment.OSVersion.Version.Major > 5)
                || ((Environment.OSVersion.Version.Major == 5) && (Environment.OSVersion.Version.Minor >= 1)))
            {
                bool retVal;

                return NativeMethods.IsWow64Process(process.Handle, out retVal) && retVal;
            }

            return false; // not on 64-bit Windows Emulator
        }
    }

    internal static class NativeMethods
    {
        [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
    }
}
person Jesse C. Slicer    schedule 23.12.2009
comment
(Environment.OSVersion.Version.Major >= 5 && Environment.OSVersion.Version.Minor >= 1) И именно поэтому Microsoft должна создать прокладки совместимости с ложью версий - чтобы обойти подобные ошибки в коде. Что произойдет, когда выйдет Windows Vista (6.0)? А потом люди ругают Microsoft за то, что она делает Windows 7 версии 6.1, а не 7.0, она исправляет так много ошибок совместимости приложений. - person Ian Boyd; 09.09.2010
comment
[Out] out bool wow64Process должен быть [Out] out Int32 wow64Process, потому что BOOL собственной функции сопоставляется с Int32 - person zhaorufei; 29.06.2011
comment
@ 赵如飞: нет. Это указатель на логическое значение. Авторитетный источник: msdn.microsoft.com/en-us/library/ms684139 - person Jesse C. Slicer; 29.06.2011
comment
Я думаю, что имя функции IsWin64 немного вводит в заблуждение. Возвращает истину, если 32-битный процесс работает под ОС x64. - person Denis The Menace; 22.04.2013
comment
Зачем использовать processHandle = Process.GetProcessById(process.Id).Handle; вместо просто processHandle = process.Handle;? - person Jonathon Reinhart; 21.06.2014
comment
@JonathonReinhart ну, это не просто хороший вопрос. Я понятия не имею. Должно быть, это было рудиментарным от смены одного способа на другой. Спасибо, что нашли это! - person Jesse C. Slicer; 21.06.2014
comment
Этот ответ неверен; и возвращать false вместо вызова исключения в случае ошибки - очень плохой дизайн. - person user626528; 19.10.2015
comment
Он используется только для 64-битной системы. Эта логика не работает в 32-битной системе. - person Nitin Parashar; 13.07.2018

Если вы используете .Net 4.0, это однострочный вариант для текущего процесса:

Environment.Is64BitProcess

См. Environment.Is64BitProcessProperty (MSDN).

person Sam    schedule 11.08.2010
comment
Не могли бы вы выложить код Is64BitProcess? Возможно, я смогу использовать то, что он делает, чтобы выяснить, работаю ли я как 64-битный процесс. - person Ian Boyd; 09.09.2010
comment
@Ian, я сомневаюсь, что Сэму будет законно разрешено публиковать MS-код на этом форуме. Я не уверен в точном содержании их справочной лицензии, но я почти уверен, что она запрещает воспроизведение кода где угодно. - person ProfK; 28.03.2011
comment
@Ian кто-то проделал эту работу за вас: stackoverflow.com/questions/336633/ - person Robert MacLean; 05.09.2011
comment
OP специально попросил запросить другой процесс, а не текущий процесс. - person Harry Johnston; 19.10.2015
comment
Обратите внимание, что Microsoft опубликовала код для Is64BitProcess (referenceource. microsoft.com/#mscorlib/system/environment.cs). Однако это просто жестко запрограммированный оператор возврата, управляемый символом компиляции. - person Brian; 10.10.2017

Выбранный ответ неверен, так как он не соответствует тому, о чем просили. Он проверяет, является ли процесс процессом x86, работающим в ОС x64; поэтому он вернет false для процесса x64 в ОС x64.
Кроме того, он некорректно обрабатывает ошибки.

Вот более правильный способ:

internal static class NativeMethods
{
    // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx
    public static bool Is64Bit(Process process)
    {
        if (!Environment.Is64BitOperatingSystem)
            return false;
        // if this method is not available in your version of .NET, use GetNativeSystemInfo via P/Invoke instead

        bool isWow64;
        if (!IsWow64Process(process.Handle, out isWow64))
            throw new Win32Exception();
        return !isWow64;
    }

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
}
person user626528    schedule 19.10.2015
comment
Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86" всегда будет возвращать истину для 32-битного процесса. Лучше использовать System.Environment.Is64BitOperatingSystem, если поддерживается .NET4 - person Aizzat Suhardi; 23.10.2017

Вы можете проверить размер указателя, чтобы определить, 32-битный он или 64-битный.

int bits = IntPtr.Size * 8;
Console.WriteLine( "{0}-bit", bits );
Console.ReadLine();
person Darwyn    schedule 23.12.2009
comment
В то время, когда этот ответ был впервые опубликован, он был не очень ясным, но OP хотел знать, как запросить другой процесс, а не текущий процесс. - person Harry Johnston; 19.10.2015

Вот однострочная проверка.

bool is64Bit = IntPtr.Size == 8;
person Vikram Bose    schedule 09.05.2013
comment
OP специально спросил, как запросить другой процесс, а не текущий процесс. - person Harry Johnston; 19.10.2015

Мне нравится использовать это:

string e = Environment.Is64BitOperatingSystem

Таким образом, если мне нужно найти или проверить файл, я могу легко написать:

string e = Environment.Is64BitOperatingSystem

       // If 64 bit locate the 32 bit folder
       ? @"C:\Program Files (x86)\"

       // Else 32 bit
       : @"C:\Program Files\";
person user1351333    schedule 13.07.2012
comment
как насчет 32-битного процесса на 64-битной машине с ОС? - person Kiquenet; 23.08.2012
comment
Неужели так сложно использовать Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) вместо жесткого программирования `C: \ Program Files`? - person Luaan; 19.10.2015
comment
Никогда не кодируйте программные файлы жестко, потому что это локализуемая строка. Αρχεία Εφαρμογών, Arquivos de Programas и т. Д. - person stevieg; 11.11.2015

person    schedule
comment
OP специально спросил, как запросить другой процесс, а не текущий процесс. - person Harry Johnston; 19.10.2015