แอปพลิเคชัน C # ของฉันจะตรวจสอบได้อย่างไรว่าแอปพลิเคชัน / กระบวนการเฉพาะ (หมายเหตุ: ไม่ใช่กระบวนการปัจจุบัน) กำลังทำงานในโหมด 32 บิตหรือ 64 บิต
ตัวอย่างเช่นฉันอาจต้องการค้นหากระบวนการโดยใช้ชื่อเช่น 'abc.exe' หรือตามหมายเลขรหัสกระบวนการ
แอปพลิเคชัน C # ของฉันจะตรวจสอบได้อย่างไรว่าแอปพลิเคชัน / กระบวนการเฉพาะ (หมายเหตุ: ไม่ใช่กระบวนการปัจจุบัน) กำลังทำงานในโหมด 32 บิตหรือ 64 บิต
ตัวอย่างเช่นฉันอาจต้องการค้นหากระบวนการโดยใช้ชื่อเช่น 'abc.exe' หรือตามหมายเลขรหัสกระบวนการ
คำตอบ:
อีกวิธีหนึ่งที่น่าสนใจที่ฉันเคยเห็นคือ:
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);
}
}
(Environment.OSVersion.Version.Major >= 5 && Environment.OSVersion.Version.Minor >= 1)
และนั่นคือเหตุผลที่ Microsoft ต้องสร้าง shims ความเข้ากันได้ของเวอร์ชันโกหก - เพื่อแก้ไขข้อบกพร่องในโค้ดเช่นนั้น จะเกิดอะไรขึ้นเมื่อ Windows Vista (6.0) ออกมา แล้วผู้คนก็ปากเสียว่า Microsoft ทำ Windows 7 เวอร์ชัน 6.1 แทนที่จะเป็น 7.0 มันก็แก้ไขบั๊กที่เข้ากับแอพได้มากมาย
processHandle = Process.GetProcessById(process.Id).Handle;
แทน just processHandle = process.Handle;
?
หากคุณกำลังใช้. Net 4.0 มันเป็นหนึ่งซับสำหรับกระบวนการปัจจุบัน:
Environment.Is64BitProcess
ดูEnvironment.Is64BitProcessProperty (MSDN)
Is64BitProcess
? บางทีฉันสามารถใช้สิ่งที่ทำเพื่อดูว่าฉันกำลังทำงานในกระบวนการ 64 บิตหรือไม่
Is64BitProcess
( referencesource.microsoft.com/#mscorlib/system/environment.cs ) อย่างไรก็ตามมันเป็นเพียงคำสั่งส่งคืนแบบฮาร์ดโค้ดซึ่งควบคุมโดยสัญลักษณ์การคอมไพล์
คำตอบที่เลือกไม่ถูกต้องเนื่องจากไม่ได้ทำตามที่ถาม ตรวจสอบว่ากระบวนการเป็นกระบวนการ 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);
}
Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86"
จะคืนค่าจริงสำหรับกระบวนการ 32 บิตเสมอ ใช้ดีกว่าSystem.Environment.Is64BitOperatingSystem
ถ้ารองรับ.
คุณสามารถตรวจสอบขนาดของตัวชี้เพื่อดูว่าเป็น 32 บิตหรือ 64 บิต
int bits = IntPtr.Size * 8;
Console.WriteLine( "{0}-bit", bits );
Console.ReadLine();
[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;
}
นี่คือการตรวจสอบบรรทัดเดียว
bool is64Bit = IntPtr.Size == 8;
ฉันชอบใช้สิ่งนี้:
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\";
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
แทนฮาร์ดโค้ด `C: \ Program Files 'หรือไม่?