.NET দিয়ে উইন্ডোজ -৪-বিট প্ল্যাটফর্মটি কীভাবে সনাক্ত করা যায়?


267

একটি। নেট 2.0 সি # অ্যাপ্লিকেশনটিতে আমি অপারেটিং সিস্টেম প্ল্যাটফর্ম সনাক্ত করতে নিম্নলিখিত কোডটি ব্যবহার করি:

string os_platform = System.Environment.OSVersion.Platform.ToString();

এটি "Win32NT" প্রদান করে। সমস্যাটি হ'ল উইন্ডোজ ভিস্তা 64৪-বিটে চলার পরেও এটি "Win32NT" ফেরত দেয়।

সঠিক প্ল্যাটফর্ম (32 বা 64 বিট) জানার জন্য অন্য কোনও পদ্ধতি আছে কি?

মনে রাখবেন যে উইন্ডোজ bit৪ বিটটিতে 32 বিট অ্যাপ্লিকেশন হিসাবে চালানোর সময় এটি 64 বিট সনাক্ত করতে হবে।

উত্তর:


199

P৪-বিট .NET ফ্রেমওয়ার্ক ২.০ তে -৪-বিট উইন্ডোজ চলমান থাকলে এটি সঠিক মান ফিরিয়ে দেবে না (এটি 32-বিট ফিরে আসবে)।

মাইক্রোসফ্টের রেমন্ড চেন যেমন বর্ণনা করেছেন, আপনাকে প্রথমে check৪-বিট প্রসেসে চলছে কিনা তা পরীক্ষা করে দেখতে হবে (আমি মনে করি। নেট আপনি ইন্টিপিটার.সাইজ পরীক্ষা করে এটি করতে পারেন), এবং আপনি যদি ৩২-বিট প্রক্রিয়াতে চলেছেন তবে আপনি এখনও উইন এপিআই ফাংশন ইসডাব্লু 64 প্রসেস কল করতে হবে। যদি এটি সত্য হয় তবে আপনি 64৪-বিট উইন্ডোতে একটি 32-বিট প্রক্রিয়াতে চলেছেন।

মাইক্রোসফ্টের রেমন্ড চেন: আপনি 64৪-বিট উইন্ডোয় চলছেন কিনা তা প্রোগ্রাম থেকে কীভাবে সনাক্ত করা যায়

আমার সমাধান:

static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();

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

public static bool InternalCheckIsWow64()
{
    if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
        Environment.OSVersion.Version.Major >= 6)
    {
        using (Process p = Process.GetCurrentProcess())
        {
            bool retVal;
            if (!IsWow64Process(p.Handle, out retVal))
            {
                return false;
            }
            return retVal;
        }
    }
    else
    {
        return false;
    }
}

7
32 বিট ওএসে চলাকালীন, ইসডাব্লু 64 প্রসেসের যে কোনও কলই ব্যতিক্রম ছুঁড়ে ফেলবে কারণ কার্নেল 32.dll থেকে সেই প্রবেশটি অনুপস্থিত। আপনার কোডপ্লেক্স থেকে 1code.codeplex.com/SourceControl/changeset/view/39074#842775 তে দেখানো সমাধানটি পরীক্ষা করা উচিত I এই পৃষ্ঠার নীচে তালিকাভুক্ত কোডটির উপর ভিত্তি করে আমারও একটি সমাধান রয়েছে, যদি আপনি যত্ন নেন তবে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে কোডটি পুনরায় ব্যবহার করছে।
dmihailescu

7
উইস এক্সপি এসপি 2 এর সাথে ইসডাব্লু 64 প্রসেস চালু হয়েছিল। আপনার যদি এক্সপি এসপি 2 বা আরও নতুন সংস্করণ প্রয়োজন হয় তবে এই কোডটি দুর্দান্ত কাজ করে।
মার্ক

3
@ ডমিহেইলস্কু, আপনি কেবল ইসডাব্লু 64৪ প্রসেসকে কল করার আগে ডসউইন ৩৩ মেথোডএক্সবাদী ব্যবহার করতে পারেন, যা 64৪ বিটঅপারেটিং সিস্টেমটির .NET 4.0 বাস্তবায়নটি করে।
নুবিশ

4
আপনার সমাধানটি একটি বিধবা Ul আলটিমেট পার্টিশন ব্যবহার করে বুটক্যাম্প চালিত ইন্টেল আই -3--37২০ কিউএম মাইক্রোপ্রসেসর সহ একটি ম্যাকবুক প্রোতে সঠিক মানটি প্রদান করে। +1
মার্ক ক্র্যাম

11
এফওয়াইআই: নেট 4.0 দিয়ে শুরু করে আপনি কেবল পরীক্ষা করতে পারেন System.Environment.Is64BitOperatingSystem। আপনি কি আপনার উত্তরে এটি সম্পাদনা করতে পারেন, বা আমাকে আপনার উত্তরে এডিট করার অনুমতি দিতে পারেন?
জোয়েল কোহর্ন

241

.NET 4 এর এনভায়রনমেন্ট ক্লাসে দুটি নতুন প্রোপার্টি রয়েছে, ইস 64 বিটপ্রসেস এবং ইস 64 বিট অপারেটিং সিস্টেম । মজার বিষয় হল, আপনি যদি রিফ্লেক্টর ব্যবহার করেন তবে দেখতে পাবেন যে তারা এমএসসিআরলিবের 32-বিট এবং 64-বিট সংস্করণগুলিতে আলাদাভাবে প্রয়োগ করা হয়েছে। 32-বিট সংস্করণটি IS64BitProcess এর জন্য মিথ্যা প্রত্যাবর্তন করে এবং ISWit64 অপসারণ সিস্টেমটির জন্য P / ইনভোকের মাধ্যমে IsWow64Process কল করে। -৪-বিট সংস্করণ উভয়ের জন্যই সত্য ফিরে আসে।


5
রিফ্লেক্টরের পরিবর্তে, কেন কেবল উত্সটি ডাউনলোড করবেন না। তারপরে আপনি মন্তব্য এবং অন্যান্য "নোট" পান।
AMissico

3
রেফারেন্স উত্স অনুসারে, এটি এর মতো কিছু করে: if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());(সিউডো-কোড)
বহুবর্ষ

5
খুশী হলাম। যদি ব্যবহারকারী। নেট 4.0 ব্যবহার করে থাকে তবে এটি অবশ্যই সঠিক উত্তর (যেমন পরিবেশ.আইএস 64৪ বিট অপারেটিং সিস্টেম)। - এফওয়াইআই সম্পত্তি .NET 3.5 তে উপস্থিত হবে না।
BrainSlugs83

4
এটি বিশেষত যা প্রশ্নের উত্তর দেয় না। নেট 2.0
অ্যাবটদেব

.NET কোর এমআইটি লাইসেন্সের অধীনে প্রকাশিত হয়েছে, যার অর্থ আপনি এর উত্স কোড Is64BitProcessএবং Is64BitOperatingSystem(সংস্করণ 2.0 এর লিঙ্কগুলি) পড়তে পারেন ।
ক্রিশ্চিয়ান সিপিতু

98

আপনি যদি নেট ফ্রেমওয়ার্ক 4.0 ব্যবহার করেন তবে এটি সহজ:

Environment.Is64BitOperatingSystem

দেখুন Environment.Is64BitOperatingSystem প্রপার্টি (দুটিই MSDN)।


2
গুরু জন্য, অভ্যন্তরীণ বাস্তবায়ন ব্যবহার IsWow64Process (...) referencesource.microsoft.com/#mscorlib/system/...
Zyo

51

এটি ব্রুনো লোপেজের উপরের পরামর্শের কেবল একটি বাস্তবায়ন, তবে Win2k + সমস্ত WinXP পরিষেবা প্যাকগুলিতে কাজ করে। ঠিক বুঝতে পেরেছি যে আমি এটি পোস্ট করেছি যাতে অন্য লোকেরা এটি হাত দিয়ে রোল না করে। (একটি মন্তব্য হিসাবে পোস্ট করা হবে, কিন্তু আমি একটি নতুন ব্যবহারকারী!)

[DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
public extern static IntPtr LoadLibrary(string libraryName);

[DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
public extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName);

private delegate bool IsWow64ProcessDelegate([In] IntPtr handle, [Out] out bool isWow64Process);

public static bool IsOS64Bit()
{
    if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
    {
        return true;
    }
    else
    {
        return false;
    }
}

private static IsWow64ProcessDelegate GetIsWow64ProcessDelegate()
{
  IntPtr handle = LoadLibrary("kernel32");

  if ( handle != IntPtr.Zero)
  {
    IntPtr fnPtr = GetProcAddress(handle, "IsWow64Process");

    if (fnPtr != IntPtr.Zero)
    {
      return (IsWow64ProcessDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)fnPtr, typeof(IsWow64ProcessDelegate));
    }
  }

  return null;
}

private static bool Is32BitProcessOn64BitProcessor()
{
  IsWow64ProcessDelegate fnDelegate = GetIsWow64ProcessDelegate();

  if (fnDelegate == null)
  {
    return false;
  }

  bool isWow64;
  bool retVal = fnDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWow64);

  if (retVal == false)
  {
    return false;
  }

  return isWow64;
}

49

পুরো উত্তরটি হ'ল (স্টেফান-মিলিগ্রাম, রিপার 234 এবং ববি শাফয়ের উত্তর দুটি থেকে নেওয়া):

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

    private bool Is64Bit()
    {
        if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    private bool Is32BitProcessOn64BitProcessor()
    {
        bool retVal;

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

        return retVal;
    } 

আপনি যদি 64৪ বিটের প্রক্রিয়াতে আছেন তবে প্রথমে পরীক্ষা করুন। আপনি যদি না হন তবে 32 বিট প্রক্রিয়াটি একটি Wow64 প্রসেস কিনা তা পরীক্ষা করে দেখুন।


13
এটি Win2000 এবং WinXP SP1 এর অধীনে এবং এর আগে ব্যর্থ হবে। আপনার ফোন করার আগে ইসডাব্লু 64৪ প্রসেস () ফাংশনটি উপস্থিত রয়েছে কিনা তা আপনাকে খতিয়ে দেখা উচিত, কারণ এটি কেবল এক্সপি এসপি 2 এবং ভিস্তা / উইন 7 এ চালু হয়েছিল।
user9876

2
@ ইউজার ৯৮76 anyone, এখনও কি কেউ এন্টিক সিস্টেমগুলিকে টার্গেট করে?
সিএমিরসিয়া

5
এই নমুনাটি প্রসেসের মাধ্যমে প্রত্যাবর্তিত প্রক্রিয়া উদাহরণটি নিষ্পত্তি করতে ব্যর্থ instance
জো

42

মাইক্রোসফ্ট এর জন্য একটি কোড নমুনা রেখে দিয়েছে:

http://1code.codeplex.com/SourceControl/changeset/view/39074#842775

দেখে মনে হচ্ছে:

    /// <summary>
    /// The function determines whether the current operating system is a 
    /// 64-bit operating system.
    /// </summary>
    /// <returns>
    /// The function returns true if the operating system is 64-bit; 
    /// otherwise, it returns false.
    /// </returns>
    public static bool Is64BitOperatingSystem()
    {
        if (IntPtr.Size == 8)  // 64-bit programs run only on Win64
        {
            return true;
        }
        else  // 32-bit programs run on both 32-bit and 64-bit Windows
        {
            // Detect whether the current process is a 32-bit process 
            // running on a 64-bit system.
            bool flag;
            return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") &&
                IsWow64Process(GetCurrentProcess(), out flag)) && flag);
        }
    }

    /// <summary>
    /// The function determins whether a method exists in the export 
    /// table of a certain module.
    /// </summary>
    /// <param name="moduleName">The name of the module</param>
    /// <param name="methodName">The name of the method</param>
    /// <returns>
    /// The function returns true if the method specified by methodName 
    /// exists in the export table of the module specified by moduleName.
    /// </returns>
    static bool DoesWin32MethodExist(string moduleName, string methodName)
    {
        IntPtr moduleHandle = GetModuleHandle(moduleName);
        if (moduleHandle == IntPtr.Zero)
        {
            return false;
        }
        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
    }

    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr GetModuleHandle(string moduleName);

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr GetProcAddress(IntPtr hModule,
        [MarshalAs(UnmanagedType.LPStr)]string procName);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

পাশাপাশি একটি ডাব্লুএমআই সংস্করণ উপলব্ধ রয়েছে (দূরবর্তী মেশিনগুলির পরীক্ষার জন্য)।



ডাব্লুএমআই সংস্করণ পরিচালিত। নেট ছাড়া? আমি এটি দেখতে চাই, এখনও অবধি এটি খুঁজে
পাইনি

16

আপনি PROCESSOR_ARCHITECTUREপরিবেশের পরিবর্তনশীলও পরীক্ষা করতে পারেন ।

এটি হয় না বা 32-বিট উইন্ডোতে "x86" তে সেট করা আছে।

private int GetOSArchitecture()
{
    string pa = 
        Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
    return ((String.IsNullOrEmpty(pa) || 
             String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? 32 : 64);
}

1
কেবলমাত্র আপনার একটি 64 বিট প্রসেসর থাকার অর্থ এই নয় যে আপনার কাছে একটি 64 বিট ওএস আছে
ডেভিড

2
@ ডেভিড এটি উইন্ডোজের প্রসেসরের আর্কিটেকচারের কথা জানায়; সিপিইউ নয় এই পৃষ্ঠায় "কোড" থেকে শুরু করে বিশদ বিবরণ দেখুন: andrewensley.com/2009/06/c-detect-windows-os-part-1
অ্যান্ড্রু এনসলে

আপনি যখন এটি চালাবেন কেবল 2 সেন্ট যুক্ত করুন, এবং আপনার অ্যাপটি আপনার হিসাবে এটির prefer 32-bitসাথে কনফিগার করা হবে তবে আপনি পাবেন তবে আপনি এটি সন্ধান না করলে আপনি পাবেন । Any CPUPlatform Targetx86Prefer 32-bitAMD64
এক্সএএমএলএমএক্স

14

ক্রিজ ইউয়েন ব্লগ থেকে

সি #। নেট 4.0 দুটি নতুন পরিবেশের পরিবেশগত পরিবেশের পরিচয় করিয়েছে .s64 বিটঅপারেটিং সিস্টেম; Environment.Is64BitProcess;

আপনি এই দুটি সম্পত্তি ব্যবহার করার সময় দয়া করে সাবধান হন। উইন্ডোজ 7 64 বিট মেশিনে পরীক্ষা করুন

//Workspace: Target Platform x86
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess False

//Workspace: Target Platform x64
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess True

//Workspace: Target Platform Any
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess True

12

দ্রুততম উপায়:

if(IntPtr.Size == 8) {
    // 64 bit machine
} else if(IntPtr.Size == 4)  {
    // 32 bit machine
} 

দ্রষ্টব্য: এটি খুব সরাসরি এবং প্রোগ্রামটি যদি 32-বিট প্রক্রিয়া হিসাবে (যেমন<Prefer32Bit>true</Prefer32Bit>প্রকল্পের সেটিংসেরমাধ্যমে)প্রয়োগ করে না তবে কেবলমাত্র 64-বিট-এ সঠিকভাবে কাজ করে।


32
এটি কাজ করবে না - যদি 32-বিট .NET ফ্রেমওয়ার্ক 2.0 তে 64-বিট উইন্ডোয় চলমান থাকে তবে এটি 32-বিট ফিরে আসবে।
স্টিফান শাল্টজ

ঠিক আমি এই পরিস্থিতি ভুলে গেছি। আমি এই বিষয়টি উল্লেখ করার জন্য প্রশ্নটি সম্পাদনা করেছি। ধন্যবাদ স্টেফান-মিলিগ্রাম।
মার্চ 10

1
এটি সঠিক নয়; প্ল্যাটফর্মটি 64 বিট হতে পারে তবে আপনি এখনও 32-বিট মোডে চলছে।
সেবাস্তিয়ান শুভ

11

এটা চেষ্টা কর:

Environment.Is64BitOperatingSystem

Environment.Is64BitProcess

5
আপনার ইনপুট জন্য ধন্যবাদ, তবে এই সমাধান ইতিমধ্যে দেওয়া হয়েছে হিসাবে পোস্ট করার আগে উপলব্ধ উত্তরগুলি পড়ুন। এছাড়াও মনে রাখবেন মূল প্রশ্ন ছিল .net 2 এই দুটি বৈশিষ্ট্য যা শুধুমাত্র সঙ্গে .net 4. চালু হয় নেই যা
মার্ক

9

@ ফুবার: আপনি ঠিক বলেছেন, এটি খুব সহজ;)

99% ক্ষেত্রে, দুর্বল সিস্টেম অ্যাডমিনিস্ট্রেটর ব্যাকগ্রাউন্ডযুক্ত বিকাশকারীরা শেষ পর্যন্ত মাইক্রোসফ্ট উইন্ডোজ গণনা করার জন্য যে কোনও ব্যক্তিকে সর্বদা যে শক্তি সরবরাহ করেছে তা উপলব্ধি করতে ব্যর্থ হয়।

সিস্টেম অ্যাডমিনিস্ট্রেটররা যখন এ জাতীয় বিন্দুতে আসে তখন সর্বদা আরও ভাল এবং সরল কোডটি লিখবে।

তবুও, একটি বিষয় লক্ষণীয়, বিল্ড কনফিগারেশনটি অবশ্যই এই সিস্টেম এনভায়রনমেন্ট ভেরিয়েবলের জন্য যথাযথ সিস্টেমগুলিতে সঠিক মানগুলি ফিরিয়ে আনার জন্য যেকোন সিসিপিইউ হতে হবে :

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

এটি 32-বিট উইন্ডোজটিতে "X86" এবং 64-বিট উইন্ডোতে "AMD64" ফিরিয়ে দেবে।


4
আপনার সমাধানটি একটি ম্যাকবুক প্রোতে ইন্টেল i7-3720QM মাইক্রোপ্রসেসরের সাথে বিধবা 7 আলটিমেট পার্টিশন সহ বুটক্যাম্প চালিত x86 প্রদান করে। স্টিফান শাল্টজির সমাধানটি প্রসেসরটিকে একটি 64 বিট হিসাবে সনাক্ত করেছে। আমি নিশ্চিত যে আপনি সেখানে উইন্ডোজ ভিত্তিক পিসির 99% সমাধান করেছেন। চেষ্টা করার জন্য +1।
মার্ক ক্র্যাম

নাঃ। আমার উইন্ডোজ 7 প্রো, -৪-বিট অপারেটিং সিস্টেমটিতে "x86" ফিরিয়েছে।
হাজাই এল

7

ডটপিক ব্যবহার করা ফ্রেমওয়ার্কটি এটি কীভাবে করে তা দেখতে সহায়তা করে। এই বিষয়টি মনে রেখে, আমি এখানে যা এলাম:

public static class EnvironmentHelper
{
    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll")]
    static extern IntPtr GetModuleHandle(string moduleName);

    [DllImport("kernel32")]
    static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    [DllImport("kernel32.dll")]
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

    public static bool Is64BitOperatingSystem()
    {
        // Check if this process is natively an x64 process. If it is, it will only run on x64 environments, thus, the environment must be x64.
        if (IntPtr.Size == 8)
            return true;
        // Check if this process is an x86 process running on an x64 environment.
        IntPtr moduleHandle = GetModuleHandle("kernel32");
        if (moduleHandle != IntPtr.Zero)
        {
            IntPtr processAddress = GetProcAddress(moduleHandle, "IsWow64Process");
            if (processAddress != IntPtr.Zero)
            {
                bool result;
                if (IsWow64Process(GetCurrentProcess(), out result) && result)
                    return true;
            }
        }
        // The environment must be an x86 environment.
        return false;
    }
}

ব্যবহারের উদাহরণ:

EnvironmentHelper.Is64BitOperatingSystem();

6

এই দুটি পরিবেশের ভেরিয়েবল (সিউডো কোড) ব্যবহার করুন:

if (PROCESSOR_ARCHITECTURE = x86 &&
    isDefined(PROCESSOR_ARCHITEW6432) &&
    PROCESSOR_ARCHITEW6432 = AMD64) {

    //64 bit OS
}
else
    if (PROCESSOR_ARCHITECTURE = AMD64) {
        //64 bit OS
    }
    else
        if (PROCESSOR_ARCHITECTURE = x86) {
            //32 bit OS
        }

HOWTO ব্লগ পোস্ট দেখুন : প্রক্রিয়া সাক্ষ্য সনাক্ত করুন


প্রশ্নটি নেট সম্পর্কে এবং সি / সি ++ নয় এমন অংশটি কি আপনি দেখেছেন? এবং এটি একটি রানটাইম চেক বনাম একটি সংকলন সময়। এছাড়াও কোডটি অ্যাসাইনমেন্ট করছে এবং তুলনা করে না।
dvlelejo

এই কোডটি .NET (2.0 এ পরীক্ষিত) এ কাজ করে। এনভ ভেরিয়েবলগুলি এর দ্বারা অ্যাক্সেস করা যায়: পরিবেশ.গেট এনভায়রনমেন্ট ভেরিয়েবল ("PROCESSOR_ARCHITECTURE"); Environment.GetEnvironmentVariable ( "PROCESSOR_ARCHITEW6432");
অ্যান্ড্রু.ফক্স

5

আমি অনেক অপারেটিং সিস্টেমে সাফল্যের সাথে এই চেকটি ব্যবহার করেছি:

private bool Is64BitSystem
{
   get
   {
      return Directory.Exists(Environment.ExpandEnvironmentVariables(@"%windir%\SysWOW64"));
   }
}

অপারেটিং সিস্টেমের ভাষা বিবেচনা না করেই এই ফোল্ডারটির নাম সর্বদা "SysWOW64" রাখা হয়। এটি .NET ফ্রেমওয়ার্ক 1.1 বা ততোধিকের জন্য কাজ করে।


এবং প্রশাসনিক অধিকারযুক্ত ব্যবহারকারী হিসাবে আমাকে 32 বিট ওএস- SysWOW64তে একটি ফোল্ডার তৈরি করা থেকে বাধা দেয় কি %windir%? ফোল্ডারের উপস্থিতি হ'ল অর্থ: ফোল্ডারটি উপস্থিত।
cogumel0

কোনও ব্যবহারকারী উদ্দেশ্য নিয়ে এমন একটি ফোল্ডার তৈরি করার সম্ভাবনাগুলি কী কী? অপারেটিং সিস্টেমটি এক্স 64 রয়েছে কিনা তা যাচাই করার জন্য এটি অন্যরকম একটি উপায়।
আলেকজান্দ্রু ডিকু

আপনার কম্পিউটারে ভাইরাস হওয়ার সম্ভাবনা কী কী? সম্ভাবনাগুলি যেহেতু বেশ কম, ততক্ষণে কোনও সুরক্ষা ইনস্টল করা ভাল নয় ... প্রোগ্রামিং এমন কিছু তৈরি করার নয় যা জেনে বুঝে ব্যর্থ হওয়ার সম্ভাবনা কম । এটি এমন কিছু তৈরি সম্পর্কে যা অজান্তে ব্যর্থ হওয়ার কম সম্ভাবনা রয়েছে - এবং তারপরে এটি ঠিক করা। প্রথমটিকে খারাপ প্রোগ্রামিং / খারাপ বাস্তবায়ন বলা হয়, দ্বিতীয়টিকে বাগ বলা হয়।
cogumel0

@ অ্যালেক্সান্দ্রডিকু আপনার উত্তরে উল্লেখ করতে হবে যে এই পদ্ধতিটি 100% সঠিক নয় এবং যদি কোনও তৃতীয় পক্ষের অ্যাপ্লিকেশন বা ব্যবহারকারীর দ্বারা ম্যানুয়ালি ফোল্ডারটি উদ্দেশ্য করে তৈরি করা হয় তবে ভুল আউটপুট দেওয়ার ঝুঁকি রয়েছে।
রাজেশ মিশ্র

4

আমার এটি করা দরকার, তবে অ্যাডমিন হিসাবে এটি দূরবর্তীভাবে করা হিসাবে আমারও সক্ষম হওয়া দরকার, উভয় ক্ষেত্রেই এটি আমার পক্ষে বেশ সুন্দরভাবে কাজ করছে বলে মনে হচ্ছে:

    public static bool is64bit(String host)
    {
        using (var reg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, host))
        using (var key = reg.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\"))
        {
            return key.GetValue("ProgramFilesDir (x86)") !=null;
        }
    }

4

এটি মাইক্রোসফ্টের কোডের উপর ভিত্তি করে একটি সমাধান যা http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 এ মাইক্রোসফ্টের কোডের উপর ভিত্তি করে । এটি সহজ কোড পুনরায় ব্যবহারের জন্য এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে।

কিছু সম্ভাব্য ব্যবহার নীচে দেখানো হয়েছে:

bool bIs64BitOS = System.Environment.OSVersion.IsWin64BitOS();

bool bIs64BitProc = System.Diagnostics.Process.GetCurrentProcess().Is64BitProc();

//Hosts the extension methods  
public static class OSHelperTools  
{  
    /// <summary>     
    /// The function determines whether the current operating system is a      
    /// 64-bit operating system.     
    /// </summary>     
    /// <returns>     
    /// The function returns true if the operating system is 64-bit;      
    /// otherwise, it returns false.     
    /// </returns>    
    public static bool IsWin64BitOS(this OperatingSystem os)  
    {  
        if (IntPtr.Size == 8)  
        // 64-bit programs run only on Win64           
            return true;   
        else// 32-bit programs run on both 32-bit and 64-bit Windows     
        {   // Detect whether the current process is a 32-bit process                
            // running on a 64-bit system.               
            return Process.GetCurrentProcess().Is64BitProc();  
        }  
    }  

    /// <summary>  
    /// Checks if the process is 64 bit  
    /// </summary>  
    /// <param name="os"></param>  
    /// <returns>  
    /// The function returns true if the process is 64-bit;        
    /// otherwise, it returns false.  
    /// </returns>    
    public static bool Is64BitProc(this System.Diagnostics.Process p)  
    {  
        // 32-bit programs run on both 32-bit and 64-bit Windows           
        // Detect whether the current process is a 32-bit process                
        // running on a 64-bit system.               
        bool result;  
        return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") && IsWow64Process(p.Handle, out result)) && result);  
    }  

    /// <summary>     
    /// The function determins whether a method exists in the export      
    /// table of a certain module.     
    /// </summary>     
    /// <param name="moduleName">The name of the module</param>     
    /// <param name="methodName">The name of the method</param>     
    /// <returns>     
    /// The function returns true if the method specified by methodName      
    /// exists in the export table of the module specified by moduleName.     
    /// </returns>       
    static bool DoesWin32MethodExist(string moduleName, string methodName)  
    {  
        IntPtr moduleHandle = GetModuleHandle(moduleName);  
        if (moduleHandle == IntPtr.Zero)  
            return false;    
        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);   
    }  
    [DllImport("kernel32.dll")]  
    static extern IntPtr GetCurrentProcess();  

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]  
    static extern IntPtr GetModuleHandle(string moduleName);  

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]  
    static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)]string procName);  

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]  
    [return: MarshalAs(UnmanagedType.Bool)]  
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);  
}

কোডপ্লেক্সের লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে।
পিটার মর্টেনসেন

3

এই পৃষ্ঠা থেকে DllImport ব্যবহার করে এখানে সি # তে সরাসরি পন্থা ।

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

আপনাকে এখনও প্রথমে পয়েন্টারের আকার পরীক্ষা করতে হবে, অন্যথায় এটি কেবল 64 টি বিট সিস্টেমে 32 বিট প্রক্রিয়া কিনা তা যাচাই করে
ব্রুনো লোপস

1
একটি পুরানো ওএসে ক্র্যাশও রয়েছে, যেহেতু IsWow64Processএটি বিদ্যমান নেই।
বহুপদী

3

আমি অনুসরণ কোড ব্যবহার করছি। দ্রষ্টব্য: এটি কোনও ইসিপিইউ প্রকল্পের জন্য তৈরি।

    public static bool Is32bitProcess(Process proc) {
        if (!IsThis64bitProcess()) return true; // We're in 32-bit mode, so all are 32-bit.

        foreach (ProcessModule module in proc.Modules) {
            try {
                string fname = Path.GetFileName(module.FileName).ToLowerInvariant();
                if (fname.Contains("wow64")) {
                    return true;
                }
            } catch {
                // What on earth is going on here?
            }
        }
        return false;
    }

    public static bool Is64bitProcess(Process proc) {
        return !Is32bitProcess(proc);
    }

    public static bool IsThis64bitProcess() {
        return (IntPtr.Size == 8);
    }

2

সিস্টেম এবং প্ল্যাটফর্মের প্ল্যাটফর্মটি যাচাই করার সেরা উপায় হিসাবে আমি এটি পেয়েছি:

bool 64BitSystem = Environment.Is64BitOperatingSystem;
bool 64BitProcess = Environment.Is64BitProcess;

প্রথম সম্পত্তিটি 64-বিট সিস্টেমের জন্য সত্য, এবং 32-বিটের জন্য মিথ্যা। দ্বিতীয় সম্পত্তি 64৪-বিট প্রক্রিয়াতে সত্য এবং 32-বিটের ক্ষেত্রে মিথ্যা দেয়।

এই দুটি বৈশিষ্ট্যের প্রয়োজন হ'ল কারণ আপনি 64-বিট সিস্টেমে 32-বিট প্রক্রিয়া চালাতে পারেন, সুতরাং আপনাকে সিস্টেম এবং প্রক্রিয়া উভয়ই পরীক্ষা করতে হবে।


1
ভেরিয়েবল নামের সামনে একটি _ বা একটি চিঠি লিখুন যদি আপনি এটি সি # তে তৈরি করতে চান (ভেরিয়েবলের নামগুলি সি # তে সংখ্যা দিয়ে শুরু করবেন না যতদূর আমার আইডিয়া আমাকে বলছে!)
ক্রিস


2

এখানে একটি উইন্ডোজ ম্যানেজমেন্ট ইনস্ট্রুমেন্টেশন (ডাব্লুএমআই) পদ্ধতি রয়েছে:

string _osVersion = "";
string _osServicePack = "";
string _osArchitecture = "";

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
ManagementObjectCollection collection = searcher.Get();

foreach (ManagementObject mbo in collection)
{
    _osVersion = mbo.GetPropertyValue("Caption").ToString();
    _osServicePack = string.Format("{0}.{1}", mbo.GetPropertyValue("ServicePackMajorVersion").ToString(), mbo.GetPropertyValue("ServicePackMinorVersion").ToString());

    try
    {
        _osArchitecture = mbo.GetPropertyValue("OSArchitecture").ToString();
    }
    catch
    {
        // OSArchitecture only supported on Windows 7/Windows Server 2008
    }
}

Console.WriteLine("osVersion     : " + _osVersion);
Console.WriteLine("osServicePack : " + _osServicePack);
Console.WriteLine("osArchitecture: " + _osArchitecture);

/////////////////////////////////////////
// Test on Windows 7 64-bit
//
// osVersion     : Microsoft Windows 7 Professional
// osservicePack : 1.0
// osArchitecture: 64-bit

/////////////////////////////////////////
// Test on Windows Server 2008 64-bit
//    --The extra r's come from the registered trademark
//
// osVersion     : Microsoftr Windows Serverr 2008 Standard
// osServicePack : 1.0
// osArchitecture: 64-bit

/////////////////////////////////////////
// Test on Windows Server 2003 32-bit
//    --OSArchitecture property not supported on W2K3
//
// osVersion     : Microsoft(R) Windows(R) Server 2003, Standard Edition
// osServicePack : 2.0
// osArchitecture:

1

OSInfo.Bits

using System;
namespace CSharp411
{
    class Program
    {
        static void Main( string[] args )
        {
           Console.WriteLine( "Operation System Information" );
           Console.WriteLine( "----------------------------" );
           Console.WriteLine( "Name = {0}", OSInfo.Name );
           Console.WriteLine( "Edition = {0}", OSInfo.Edition );
           Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack );
           Console.WriteLine( "Version = {0}", OSInfo.VersionString );
           Console.WriteLine( "Bits = {0}", OSInfo.Bits );
           Console.ReadLine();
        }
    }
}

3
এগুলি দুর্দান্ত, তবে এই শ্রেণিটি মাইক্রোসফ্ট থেকে এসেছে p আমি কেবল প্ল্যাটফর্মের বিটগুলি জানতে এই রেফারেন্সটি অন্তর্ভুক্ত করতে চাই না।
মার্ক

"সি: \ প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট.নেট \ এসডিকে \ ভি ২.০ bit৪ বিবিট ate লেটব্রেকিং \ প্ল্যাটফর্মআইভোক \ উইনএপিআইস \ ওএসআইএনফো \ সিএস \ OSInfoCS.sln"
এএমিসিকো

1

আপনার প্রকল্পের একটি শ্রেণিতে নিম্নলিখিত কোডটি অন্তর্ভুক্ত করুন:

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

    public static int GetBit()
    {
        int MethodResult = "";
        try
        {
            int Architecture = 32;

            if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6)
            {
                using (Process p = Process.GetCurrentProcess())
                {
                    bool Is64Bit;

                    if (IsWow64Process(p.Handle, out Is64Bit))
                    {
                        if (Is64Bit)
                        {
                            Architecture = 64;

                        }

                    }

                }

            }

            MethodResult = Architecture;

        }
        catch //(Exception ex)
        {
            //ex.HandleException();
        }
        return MethodResult;
    }

এটি এর মতো ব্যবহার করুন:

string Architecture = "This is a " + GetBit() + "bit machine";

0

ইনস্টল উইন্ডোজ আর্কিটেকচারটি পেতে এটি ব্যবহার করুন:

string getOSArchitecture()
{
    string architectureStr;
    if (Directory.Exists(Environment.GetFolderPath(
                           Environment.SpecialFolder.ProgramFilesX86))) {
        architectureStr ="64-bit";
    }
    else {
        architectureStr = "32-bit";
    }
    return architectureStr;
}

আমার কাছে ডাব্লু 7x64 বনাম 2010-এ কোনও প্রোগ্রামফাইলএক্স 86 সম্পত্তি নেই
খ্রিস্টান কাসুট

0

প্রদত্ত যে গৃহীত উত্তরটি খুব জটিল। আরও সহজ উপায় আছে। খনি হ'ল আলেকজান্দ্রিডিকুর অ্যান্যাসওয়ারের একটি প্রকরণ। প্রোগ্রাম ফাইলগুলিতে x৪-বিট উইন্ডোজ ৩২-বিট অ্যাপ্লিকেশন ইনস্টল করে (x86) আপনি পরিবেশের ভেরিয়েবল (বিভিন্ন স্থানীয়করণের জন্য) ব্যবহার করে ফোল্ডারটি বিদ্যমান কিনা তা পরীক্ষা করতে পারেন

যেমন

private bool Is64BitSystem
{
   get
   {
      return Directory.Exists(Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES(X86)%"));
   }
}

এটি আমার পক্ষে দ্রুত এবং সহজ। প্রদত্ত যে আমি ওএস সংস্করণের উপর ভিত্তি করে সেই ফোল্ডারের অধীনে একটি নির্দিষ্ট পাথ অ্যাক্সেস করতে চাই।


2
গৃহীত উত্তরটি .NET 2.0 এর জন্য ছিল। আপনি .NET 4.0 বা আরও নতুন অবস্থানে থাকলে, আপনি বেশিরভাগ ভোটের উত্তরে উত্তরটি পেতে পারেন ঠিক তেমন পরিবেশ.আইএস B৪ বিট অপারেটিং সিস্টেম ব্যবহার করুন।
মার্ক

হ্যাঁ, আমার। নেট 2.0 এর জন্যও।
জন ডেমেট্রিউ

-2

উপভোগ করুন ;-)

Function Is64Bit() As Boolean

    Return My.Computer.FileSystem.SpecialDirectories.ProgramFiles.Contains("Program Files (x86)")

End Function

-1 এটি স্থানীয়ীকৃত উইন্ডোজ ইনস্টলেশনগুলিতে কাজ করবে না। এবং এটি ভিবি নেট ব্যবহার করে যেখানে প্রশ্নটি # # এর জন্য ট্যাগ করা আছে।
মার্চ

-3

"সি: \ প্রোগ্রাম ফাইলগুলি (x86)" বিদ্যমান কিনা তা কেবল দেখুন। যদি তা না হয় তবে আপনি 32 বিট ওএসে রয়েছেন। যদি এটি হয় তবে ওএসটি 64 বিট (উইন্ডোজ ভিস্তা বা উইন্ডোজ 7)। এটি যথেষ্ট সহজ বলে মনে হচ্ছে ...


5
আপনি win32 API থেকে হার্ডকোডিংয়ের পরিবর্তে সঠিক স্থানীয়করণের ডিরেক্টরি নামটি পুনরুদ্ধার করেছেন তা নিশ্চিত করুন।
খ্রিস্টান হাইটার

আমি বলব এটি একটি ভাল ধারণা, তবে আপনি ধরে নিতে পারবেন না যে কোনও ব্যবহারকারী কোনও অস্পষ্ট কারণে এটি কখনও করবেন না।
গুরদীপএস

2
কিছু দুর্বল-লিখিত অ্যাপ্লিকেশন এখন আর্কিটেকচারের বিষয়টি বিবেচনা না করে সরাসরি "প্রোগ্রাম ফাইল (x86)" এ ইনস্টল করছে। উদাহরণস্বরূপ, আমার ৩২-বিট মেশিনে এই ডিরেক্টরিটি ধন্যবাদ সোপসোনারকে ধন্যবাদ।
লাড্ডেজ

-4

আমি ব্যবহার করি:

Dim drivelet As String = Application.StartupPath.ToString
If Directory.Exists(drivelet(0) & ":\Program Files (x86)") Then
    MsgBox("64bit")
Else
    MsgBox("32bit")
End if

এটি আপনার কম্পিউটারে বিভিন্ন স্থানে ইনস্টল করার ক্ষেত্রে আপনার অ্যাপ্লিকেশন চালু হওয়ার পথটি পায়। এছাড়াও, আপনি কেবলমাত্র সাধারণ C:\পথটি করতে পারেন যেহেতু 99.9% কম্পিউটারে উইন্ডোজ ইনস্টল রয়েছে C:\


8
খুব খারাপ পদ্ধতির। ভবিষ্যতে যদি এই ডিরেক্টরিটির নামকরণ করা হবে তবে কী হবে? উইন্ডোজ স্থানীয়করণ সংস্করণ সম্পর্কে কি? উইন্ডোজ এক্সপি-তে জার্মান "প্রোগ্রাম ফাইলগুলি" বলা হয় "প্রোগ্রাম"। আমি নিশ্চিত নই তবে এক্সপি 64 এইভাবে এটি "প্রোগ্রাম (x86)" বলতে পারে।
মার্ক

1
আমি এটির প্রস্তাব দিচ্ছি না তবে আপনি পরিবেশগত ভার% প্রোগ্রামফায়ালগুলি (x86)%
ম্যাথু লক

-7

আমি নিম্নলিখিতগুলির একটি সংস্করণ ব্যবহার করি:

    public static bool Is64BitSystem()
    {
        if (Directory.Exists(Environment.GetEnvironmentVariable("Program Files (x86)"))) return true;
        else return false;
    }

6
স্থানীয়করণযুক্ত প্রোগ্রাম ফোল্ডারগুলির নামের কারণে এটি অ-ইংরাজীবিহীন এক্সপি সংস্করণগুলিতে কাজ করে না।
ড্যানিয়েল Schlößer

তবে এমনকি -৪-বিট সিস্টেমে এই ফোল্ডারটি হাহা
সতর্কতার সাথে 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.