प्रोग्रामेटिक रूप से कैसे निर्धारित किया जाए कि क्या कोई विशेष प्रक्रिया 32-बिट या 64-बिट है


102

मेरा C # आवेदन कैसे जांच सकता है कि क्या कोई विशेष एप्लिकेशन / प्रक्रिया (नोट: वर्तमान प्रक्रिया नहीं) 32-बिट या 64-बिट मोड में चल रही है?

उदाहरण के लिए, मैं किसी विशेष प्रक्रिया को नाम से, यानी 'abc.exe', या प्रक्रिया आईडी नंबर के आधार पर क्वेरी करना चाह सकता हूं।


कृपया भाषा को हमेशा टैग के रूप में रखें; मैं इस पोस्ट पर अब बदल दूँगा। :-)
डीन जे

3
कृपया स्पष्ट करें कि क्या आप जानना चाहते हैं कि वर्तमान प्रक्रिया 64 बिट है या आप किसी अन्य प्रक्रिया को क्वेरी कर रहे हैं?
मेहरदाद अफश्री

जवाबों:


177

मैंने देखा है और अधिक दिलचस्प तरीकों में से एक है:

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 को संस्करण झूठ संगतता शिमेस बनाना पड़ता है - जैसे कोड में बग के आसपास काम करने के लिए। जब विंडोज विस्टा (6.0) सामने आता है तो क्या होता है? और फिर लोग 7.0 के बजाय विंडोज 7 वर्जन 6.1 बनाने के लिए माइक्रोसॉफ्ट को बुरा मानते हैं, यह इतने सारे ऐप-कॉम्पिटिटिव बग्स को ठीक करता है।
इयान बॉयड

4
फंक्शन का नाम IsWin64 थोड़ा भ्रामक है, मुझे लगता है। यदि x64 OS के अंतर्गत 32-बिट प्रक्रिया चल रही है तो यह सही है।
डेनिस द मेनेस

2
processHandle = Process.GetProcessById(process.Id).Handle;सिर्फ के बजाय क्यों उपयोग करें processHandle = process.Handle;?
जोनाथन रेनहार्ट

1
@JonathonReinhart अच्छी तरह से यह सिर्फ एक अच्छा सवाल नहीं है। मुझे पता नहीं है। चीजों को एक तरीके से दूसरे तरीके से करने के लिए एक स्विचिंग से यह वेस्टिस्टियल रहा होगा। कि खोजने के लिए धन्यवाद!
जेसी सी। स्लीकर

1
यह उत्तर गलत है; और त्रुटि के मामले में एक अपवाद को बढ़ाने के बजाय झूठे लौटना एक बहुत ही खराब डिजाइन है।
उपयोगकर्ता 626528

141

यदि आप .Net 4.0 का उपयोग कर रहे हैं, तो यह वर्तमान प्रक्रिया के लिए एक-लाइनर है:

Environment.Is64BitProcess

पर्यावरण को देखें ।s64BitProcessProperty (MSDN)।


2
क्या आप का कोड पोस्ट कर सकते हैं Is64BitProcess? अगर मैं एक 64-बिट प्रक्रिया के रूप में चल रहा हूं तो शायद मैं इसका उपयोग कर सकता हूं।
इयान बॉयड

1
@ इयान, मुझे संदेह है कि सैम को कानूनी रूप से इस मंच पर एमएस कोड पोस्ट करने की अनुमति होगी। मैं उनके संदर्भ लाइसेंस की सटीक सामग्री के बारे में निश्चित नहीं हूं, लेकिन मुझे पूरा यकीन है कि यह कहीं भी कोड के प्रजनन का समर्थन करता है।
ProfK

3
@ किसी ने आपके लिए वह काम किया है: stackoverflow.com/questions/336633/…
रॉबर्ट मैकलेन

4
ओपी ने विशेष रूप से किसी अन्य प्रक्रिया को क्वेरी करने के लिए कहा , न कि वर्तमान प्रक्रिया को।
हैरी जॉनसन

1
ध्यान दें कि Microsoft नेIs64BitProcess ( Referenceource.microsoft.com/#mscorlib/system/environment.cs ) के लिए कोड पोस्ट किया था । हालाँकि, यह सिर्फ एक हार्ड-कोडेड रिटर्न स्टेटमेंट है, जिसे संकलन प्रतीक द्वारा नियंत्रित किया गया है।
ब्रायन

20

चयनित उत्तर गलत है क्योंकि यह वह नहीं करता है जो पूछा गया था। यह जाँचता है कि क्या एक प्रक्रिया एक x86 प्रक्रिया है जो इसके बजाय x64 OS पर चल रही है; इसलिए यह x64 OS पर x64 प्रक्रिया या x86 OS पर चलने वाली x86 प्रक्रिया के लिए "गलत" लौटाएगा।
इसके अलावा, यह त्रुटियों को सही ढंग से नहीं संभालता है।

यहाँ एक अधिक सही तरीका है:

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
जिस समय यह उत्तर पहली बार पोस्ट किया गया था वह बहुत स्पष्ट नहीं था, लेकिन ओपी यह जानना चाहता था कि वर्तमान प्रक्रिया के बजाय किसी अन्य प्रक्रिया को कैसे क्वेरी किया जाए ।
हैरी जॉनसन

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
ओपी ने विशेष रूप से किसी अन्य प्रक्रिया को क्वेरी करने के लिए कहा , वर्तमान प्रक्रिया नहीं।
हैरी जॉनसन

1

यहाँ एक पंक्ति की जाँच है।

bool is64Bit = IntPtr.Size == 8;

6
ओपी ने विशेष रूप से किसी अन्य प्रक्रिया को क्वेरी करने के लिए कहा , वर्तमान प्रक्रिया नहीं।
हैरी जॉनसन

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
64 बिट OS मशीन में 32 बिट की प्रक्रिया क्या है?
Kiquenet

3
क्या Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)हार्ड-कोडिंग `C: \ Program Files` के बजाय उपयोग करना वास्तव में इतना कठिन है ?
लुआण

2
कभी भी हार्ड-कोड "प्रोग्राम फाइल्स" नहीं, क्योंकि यह एक स्थानीय स्ट्रिंग है। Αργώα ραρμοΑν, आर्किवोस डी प्रोग्रामास, आदि
स्टीव नोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.