প্রোগ্রামিয়ালি কীভাবে নির্ধারণ করবেন যে কোনও নির্দিষ্ট প্রক্রিয়া 32-বিট বা 64-বিট কিনা


102

আমার সি # অ্যাপ্লিকেশনটি কোনও নির্দিষ্ট অ্যাপ্লিকেশন / প্রক্রিয়া (নোট: বর্তমান প্রক্রিয়া নয়) 32-বিট বা -৪-বিট মোডে চলছে কিনা তা কীভাবে পরীক্ষা করতে পারে?

উদাহরণস্বরূপ, আমি একটি বিশেষ প্রক্রিয়াটির নাম, অর্থাত্ 'abc.exe', বা প্রক্রিয়া আইডি নম্বরের ভিত্তিতে জিজ্ঞাসা করতে চাই।


ভাষাটিকে সর্বদা একটি ট্যাগ হিসাবে রাখুন; আমি এখন এই পোস্টে এটি পরিবর্তন করব। :-)
ডিন জে

3
আপনি বর্তমান প্রক্রিয়াটি 64 বিট বা আপনি অন্য কোনও প্রক্রিয়া অনুসন্ধান করছেন কিনা তা জানতে চান কিনা তা দয়া করে স্পষ্ট করে বলুন?
মেহরদাদ আফশারি

উত্তর:


177

আমি যে আরও আকর্ষণীয় উপায় দেখেছি তা হ'ল:

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

Processes৪-বিট এমুলেটর (ডাব্লুডাব্লু )64) এ অন্য প্রক্রিয়াগুলি চলছে কিনা তা জানতে, এই কোডটি ব্যবহার করুন:

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) এবং এজন্য মাইক্রোসফ্টকে ভার্সন মিথ্যা সামঞ্জস্যতা শিমস তৈরি করতে হবে - এর মতো কোডে বাগের চারপাশে কাজ করতে। উইন্ডোজ ভিস্তা (.0.০) বেরিয়ে আসলে কী ঘটে? এবং লোকেরা তখন 7.0 এর পরিবর্তে উইন্ডোজ 7 সংস্করণ 6.1 তৈরি করার জন্য খারাপ মুখের মাইক্রোসফ্ট করে, এটি এতগুলি অ্যাপ-কম্প্যাট বাগগুলি সংশোধন করে।
আয়ান বাল্ড

4
আমার মনে হয় ফাংশনটির নাম ইসউইন 64 কিছুটা বিভ্রান্তিকর। যদি 32-বিট প্রক্রিয়াটি x64 OS এর অধীনে চলতে থাকে তবে এটি সত্য হয়।
ডেনিস দ্য মেনেস

2
ন্যায়বিচারের processHandle = Process.GetProcessById(process.Id).Handle;পরিবর্তে কেন ব্যবহার করবেন processHandle = process.Handle;?
জোনাথন রেইনহার্ট

1
@ জোনাথনরাইনহার্ট ভাল এটি ঠিক একটি ভাল প্রশ্ন নয়। আমার কোন ধারণা নাই. জিনিসগুলি এক পথে অন্য পথে ঘুরিয়ে ঘুরিয়ে ঘুরিয়ে ঘুরিয়ে ফেলার সময় থেকে এটি অবশ্যই বিচার্য হয়েছে। এটি সন্ধানের জন্য ধন্যবাদ!
জেসি সি স্লিকার

1
এই উত্তরটি ঠিক ভুল; এবং ত্রুটির ক্ষেত্রে ব্যতিক্রম উত্থাপনের পরিবর্তে মিথ্যা প্রত্যাবর্তন করা খুব খারাপ নকশা।
ব্যবহারকারী 626528

141

যদি আপনি। নেট 4.0 ব্যবহার করে থাকেন তবে এটি বর্তমান প্রক্রিয়ার জন্য ওয়ান-লাইনার:

Environment.Is64BitProcess

দেখুন Environment.Is64BitProcessProperty (দুটিই MSDN)।


2
আপনি কি কোড পোস্ট করতে পারেন Is64BitProcess? আমি যদি a৪-বিট প্রক্রিয়া হিসাবে চালাচ্ছি তবে আমি এটি কী করতে পারি তা ব্যবহার করতে পারি।
আয়ান বাল্ড

1
@ আইয়ান, আমি সন্দেহ করি যে স্যামকে এই ফোরামে এমএস কোড পোস্ট করার জন্য আইনত অনুমতি দেওয়া হবে। আমি তাদের রেফারেন্স লাইসেন্সের সঠিক বিষয়বস্তু সম্পর্কে নিশ্চিত নই, তবে আমি নিশ্চিত যে এটি কোথাও কোথাও কোডটির পুনরুত্পাদনটিকে নিষিদ্ধ করে।
অধ্যাপক

3
: @Ian কেউ আপনাকে জন্য যে কাজ করেছেন stackoverflow.com/questions/336633/...
রবার্ট MacLean

4
ওপি বিশেষত অন্য প্রক্রিয়াটি জিজ্ঞাসা করতে বলেছে , বর্তমান প্রক্রিয়াটি নয়।
হ্যারি জনস্টন

1
লক্ষ্য করুন মাইক্রোসফট করেনি কোড পোষ্ট Is64BitProcess( referencesource.microsoft.com/#mscorlib/system/environment.cs )। তবে এটি কেবল একটি হার্ড-কোডড রিটার্ন স্টেটমেন্ট, সংকলন প্রতীক দ্বারা নিয়ন্ত্রিত।
ব্রায়ান

20

নির্বাচিত উত্তরটি ভুল কারণ এটি যা চাওয়া হয়েছিল তা করে না। এটি পরীক্ষা করে যে কোনও প্রক্রিয়া পরিবর্তে x 64 OS এ চলছে এমন একটি x86 প্রক্রিয়া কিনা; সুতরাং এটি x64 OS বা x86 OS এ চলমান x86 প্রসেসের জন্য 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);
}

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 বিবিএস ওএস মেশিনে 32 বিট প্রক্রিয়া সম্পর্কে কী?
কিকিনেট

3
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)হার্ড-কোডিং `সি: \ প্রোগ্রাম ফাইলস instead এর পরিবর্তে এটি ব্যবহার করা কি আসলেই কঠিন ?
লুয়ান

2
হার্ড-কোড "প্রোগ্রাম ফাইলগুলি" কখনই না, কারণ এটি স্থানীয়করণযোগ্য স্ট্রিং। Αρχεία Εφαρμογών, Arquivos ডি প্রোগ্রাম, ইত্যাদি
stevieg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.