Belirli bir işlemin 32 bit mi yoksa 64 bit mi olduğunu programatik olarak belirleme


102

C # uygulamam belirli bir uygulamanın / işlemin (not: mevcut işlemin değil) 32 bit modunda mı yoksa 64 bit modunda mı çalıştığını nasıl kontrol edebilir?

Örneğin, belirli bir işlemi adıyla, yani 'abc.exe' ile veya işlem kimlik numarasına göre sorgulamak isteyebilirim.


Lütfen dili her zaman etiket olarak girin; Bunu şimdi bu yazıda değiştireceğim. :-)
Dean J

3
Lütfen mevcut işlemin 64 bit olup olmadığını mı yoksa başka bir işlemi mi sorguladığınızı açıklayın.
Mehrdad Afshari

Yanıtlar:


178

Gördüğüm daha ilginç yollardan biri şudur:

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

64 bit emülatörde (WOW64) DİĞER işlemlerin çalışıp çalışmadığını öğrenmek için şu kodu kullanın:

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) İşte bu nedenle Microsoft, bu tür kodlardaki hataları gidermek için sürüm yalan uyumluluk şimleri oluşturmalıdır. Windows Vista (6.0) çıktığında ne olur? Ve daha sonra insanlar, Microsoft'un 7.0 yerine Windows 7 sürüm 6.1'i yaptığı için, pek çok uygulama uyumlu hatayı düzeltir.
Ian Boyd

4
IsWin64 isminin biraz yanıltıcı olduğunu düşünüyorum. 32 bit işlem x64 işletim sistemi altında çalışıyorsa doğru döndürür.
Denis Menace

2
Neden processHandle = Process.GetProcessById(process.Id).Handle;sadece yerine kullanalım processHandle = process.Handle;?
Jonathon Reinhart

1
@JonathonReinhart, bu sadece iyi bir soru değil. Hiç bir fikrim yok. Bir şeyleri bir şekilde diğerine çevirmekten körelmiş olmalı. Bunu bulduğunuz için teşekkürler!
Jesse C. Slicer

1
Bu cevap sadece yanlıştır; ve bir hata durumunda istisna oluşturmak yerine yanlış döndürmek çok kötü bir tasarımdır.
user626528

141

.Net 4.0 kullanıyorsanız, mevcut işlem için tek satırlık bir programdır:

Environment.Is64BitProcess

Bkz. Environment.Is64BitProcessProperty (MSDN).


2
Kodunu gönderebilir misin Is64BitProcess? Belki 64 bitlik bir işlem olarak çalışıp çalışmadığımı anlamak için ne yaptığını kullanabilirim.
Ian Boyd

1
@ Ian, Sam'in yasal olarak bu foruma MS kodu göndermesine izin verileceğinden şüpheliyim. Referans lisanslarının tam içeriğinden emin değilim, ancak kodun herhangi bir yerde çoğaltılmasını yasakladığından oldukça eminim.
ProfK

3
@Birisi sizin için bu işi yaptı: stackoverflow.com/questions/336633/…
Robert MacLean

4
OP , mevcut süreci değil, özellikle başka bir süreci sorgulamayı istedi .
Harry Johnston

1
Microsoft'un ( referenceource.microsoft.com/#mscorlib/system/environment.cs ) kodunu gönderdiğini unutmayın . Ancak, bu sadece derleme sembolü tarafından kontrol edilen sabit kodlanmış bir dönüş ifadesidir. Is64BitProcess
Brian

20

Seçilen cevap, sorulan şeyi yapmadığı için yanlış. Bir işlemin x64 işletim sisteminde çalışan bir x86 işlemi olup olmadığını denetler; bu nedenle, x64 işletim sistemi üzerinde bir x64 işlemi veya x86 işletim sistemi üzerinde çalışan x86 işlemi için "yanlış" döndürür.
Ayrıca, hataları doğru şekilde işlemez.

İşte daha doğru bir yöntem:

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 bitlik bir işlem için her zaman doğru olarak dönecektir. System.Environment.Is64BitOperatingSystem.NET4 destekleniyorsa kullanmak daha iyidir
Aizzat Suhardi

10

32 bit mi yoksa 64 bit mi olduğunu belirlemek için bir işaretçinin boyutunu kontrol edebilirsiniz.

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

6
Bu cevabın ilk gönderildiği tarihte çok net değildi, ancak OP mevcut süreç yerine başka bir süreci nasıl sorgulayacağını bilmek istedi .
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, özellikle mevcut süreci değil, başka bir süreci nasıl sorgulayacağını sordu .
Harry Johnston

1

İşte tek satırlık kontrol.

bool is64Bit = IntPtr.Size == 8;

6
OP, özellikle mevcut süreci değil, başka bir süreci nasıl sorgulayacağını sordu .
Harry Johnston

0

Bunu kullanmayı seviyorum:

string e = Environment.Is64BitOperatingSystem

Bu şekilde, bir dosyayı bulmam veya doğrulamam gerekirse, kolayca yazabileceğim:

string e = Environment.Is64BitOperatingSystem

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

       // Else 32 bit
       : @"C:\Program Files\";

13
64bit OS Makinesinde 32bit işlemine ne dersiniz?
Kiquenet

3
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)"C: \ Program Files" ı sabit kodlamak yerine kullanmak gerçekten bu kadar zor mu?
Luaan

2
Yerelleştirilebilir bir dize olduğu için asla "program dosyalarını" sabit kodlamayın. Αρχεία Εφαρμογών, Arquivos de Programas, vb.
stevieg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.