如何以编程方式确定特定进程是32位还是64位

我的C#应用​​程序如何检查某个特定的应用程序/进程(注意:不是当前进程)是以32位还是64位模式运行?

例如,我可能想要通过名称查询特定的进程,即“abc.exe”或基于进程ID号。

我见过的一个更有趣的方式是:

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

如果您使用的是.Net 4.0,那么对于当前的stream程来说,

 Environment.Is64BitProcess 

请参阅Environment.Is64BitProcessProperty (MSDN)。

选定的答案是不正确的,因为它没有做什么问。 它检查进程是否是在x64操作系统上运行的x86进程; 所以它将在x86操作系统上运行的x64操作系统或x86进程上返回“false”。
而且,它不能正确处理错误。

这是一个更正确的方法:

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

您可以检查一个指针的大小,以确定它是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 

这样,如果我需要find或validation文件,我可以很容易地写:

 string e = Environment.Is64BitOperatingSystem // If 64 bit locate the 32 bit folder ? @"C:\Program Files (x86)\" // Else 32 bit : @"C:\Program Files\";