วิธีตรวจสอบโดยทางโปรแกรมว่ากระบวนการใดเป็น 32 บิตหรือ 64 บิต


102

แอปพลิเคชัน C # ของฉันจะตรวจสอบได้อย่างไรว่าแอปพลิเคชัน / กระบวนการเฉพาะ (หมายเหตุ: ไม่ใช่กระบวนการปัจจุบัน) กำลังทำงานในโหมด 32 บิตหรือ 64 บิต

ตัวอย่างเช่นฉันอาจต้องการค้นหากระบวนการโดยใช้ชื่อเช่น 'abc.exe' หรือตามหมายเลขรหัสกระบวนการ


โปรดใส่ภาษาเป็นแท็กเสมอ ฉันจะเปลี่ยนตอนนี้ในโพสต์นี้ :-)
Dean J

3
โปรดชี้แจงว่าคุณต้องการทราบว่ากระบวนการปัจจุบันเป็น 64 บิตหรือคุณกำลังสอบถามกระบวนการอื่นหรือไม่?
Mehrdad Afshari

คำตอบ:


178

อีกวิธีหนึ่งที่น่าสนใจที่ฉันเคยเห็นคือ:

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);
    }
}

8
(Environment.OSVersion.Version.Major >= 5 && Environment.OSVersion.Version.Minor >= 1) และนั่นคือเหตุผลที่ Microsoft ต้องสร้าง shims ความเข้ากันได้ของเวอร์ชันโกหก - เพื่อแก้ไขข้อบกพร่องในโค้ดเช่นนั้น จะเกิดอะไรขึ้นเมื่อ Windows Vista (6.0) ออกมา แล้วผู้คนก็ปากเสียว่า Microsoft ทำ Windows 7 เวอร์ชัน 6.1 แทนที่จะเป็น 7.0 มันก็แก้ไขบั๊กที่เข้ากับแอพได้มากมาย
Ian Boyd

4
ฉันคิดว่าชื่อฟังก์ชัน IsWin64 นั้นทำให้เข้าใจผิดเล็กน้อย จะส่งคืนจริงหากกระบวนการ 32 บิตกำลังทำงานภายใต้ x64 OS
Denis The Menace

2
ทำไมต้องใช้processHandle = Process.GetProcessById(process.Id).Handle;แทน just processHandle = process.Handle;?
Jonathon Reinhart

1
@JonathonReinhart ดีไม่ใช่แค่คำถามที่ดี ฉันไม่รู้. มันต้องเป็นร่องรอยจากการเปลี่ยนไปทำสิ่งหนึ่งไปอีกทางหนึ่ง ขอบคุณที่ค้นพบ!
Jesse C. Slicer

1
คำตอบนี้ไม่ถูกต้อง และส่งคืนเท็จแทนการเพิ่มข้อยกเว้นในกรณีที่มีข้อผิดพลาดเป็นการออกแบบที่แย่มาก
user626528

141

หากคุณกำลังใช้. Net 4.0 มันเป็นหนึ่งซับสำหรับกระบวนการปัจจุบัน:

Environment.Is64BitProcess

ดูEnvironment.Is64BitProcessProperty (MSDN)


2
คุณช่วยโพสต์รหัสของIs64BitProcess? บางทีฉันสามารถใช้สิ่งที่ทำเพื่อดูว่าฉันกำลังทำงานในกระบวนการ 64 บิตหรือไม่
Ian Boyd

1
@ เอียนฉันสงสัยว่าแซมจะได้รับอนุญาตตามกฎหมายให้โพสต์รหัส MS ในฟอรัมนี้ ฉันไม่แน่ใจเกี่ยวกับเนื้อหาที่แน่นอนของใบอนุญาตอ้างอิง แต่ฉันค่อนข้างแน่ใจว่ามันสั่งให้ทำซ้ำรหัสทุกที่
ProfK

3
@ Ian มีคนทำงานให้คุณ: stackoverflow.com/questions/336633/…
Robert MacLean

4
OP ขอให้สอบถามกระบวนการอื่นโดยเฉพาะไม่ใช่กระบวนการปัจจุบัน
Harry Johnston

1
โปรดทราบว่า Microsoft ได้โพสต์รหัสสำหรับIs64BitProcess( referencesource.microsoft.com/#mscorlib/system/environment.cs ) อย่างไรก็ตามมันเป็นเพียงคำสั่งส่งคืนแบบฮาร์ดโค้ดซึ่งควบคุมโดยสัญลักษณ์การคอมไพล์
Brian

20

คำตอบที่เลือกไม่ถูกต้องเนื่องจากไม่ได้ทำตามที่ถาม ตรวจสอบว่ากระบวนการเป็นกระบวนการ x86 ที่ทำงานบน x64 OS แทนหรือไม่ ดังนั้นมันจะส่งคืน "เท็จ" สำหรับกระบวนการ x64 บน x64 OS หรือกระบวนการ x86 ที่ทำงานบน x86 OS
นอกจากนี้ยังจัดการข้อผิดพลาดไม่ถูกต้อง

นี่คือวิธีการที่ถูกต้องมากขึ้น:

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);
}

1
Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86"จะคืนค่าจริงสำหรับกระบวนการ 32 บิตเสมอ ใช้ดีกว่าSystem.Environment.Is64BitOperatingSystemถ้ารองรับ.
NET4

10

คุณสามารถตรวจสอบขนาดของตัวชี้เพื่อดูว่าเป็น 32 บิตหรือ 64 บิต

int bits = IntPtr.Size * 8;
Console.WriteLine( "{0}-bit", bits );
Console.ReadLine();

6
ในขณะที่คำตอบนี้ถูกโพสต์ครั้งแรกยังไม่ชัดเจนนัก แต่ OP ต้องการทราบวิธีสอบถามกระบวนการอื่นแทนที่จะเป็นกระบวนการปัจจุบัน
Harry Johnston

3
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);

public static bool Is64Bit()
{
    bool retVal;

    IsWow64Process(Process.GetCurrentProcess().Handle, out retVal);

    return retVal;
}

5
OP ถามเป็นพิเศษว่าจะสอบถามกระบวนการอื่นอย่างไรไม่ใช่กระบวนการปัจจุบัน
Harry Johnston

1

นี่คือการตรวจสอบบรรทัดเดียว

bool is64Bit = IntPtr.Size == 8;

6
OP ถามเป็นพิเศษว่าจะสอบถามกระบวนการอื่นอย่างไรไม่ใช่กระบวนการปัจจุบัน
Harry Johnston

0

ฉันชอบใช้สิ่งนี้:

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\";

13
แล้วกระบวนการ 32 บิตในเครื่อง OS 64 บิตล่ะ?
Kiquenet

3
มันยากมากที่จะใช้Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)แทนฮาร์ดโค้ด `C: \ Program Files 'หรือไม่?
Luaan

2
อย่าฮาร์ดโค้ด "ไฟล์โปรแกรม" เพราะเป็นสตริงที่แปลได้ ΑρχείαΕφαρμογών, Arquivos de Programas ฯลฯ
stevieg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.