2009-12-23 12 views
84

Come può la mia applicazione C# controllare se una particolare applicazione/processo (nota: non il processo corrente) è in esecuzione in modalità a 32 o 64 bit ?Come determinare a livello di programma se un particolare processo è a 32 bit o 64 bit

Per esempio, potrei voler interrogare un particolare processo per nome, cioè "abc.exe" o in base al numero ID del processo.

+0

si prega di mettere sempre la lingua come un tag; Lo cambierò ora su questo post. :-) –

+3

Si prega di chiarire se si desidera conoscere il ** processo ** corrente è 64 bit o si sta interrogando un altro processo? –

+0

Duplicato: http://stackoverflow.com/questions/266082/how-do-i-tell-if-my-application-is-running-as-a-32-or-64-bit-application –

risposta

151

Uno dei modi più interessanti che ho visto è questo:

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

per verificare se altri processi sono in esecuzione in 64 bit emulatore (WOW64), utilizzare questo codice:

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

+1 per "Il futuro è ora!" – Dykam

+0

Salve, funzionerà per l'istanza corrente. ma voglio sapere per qualche altro processo che è già in esecuzione. Pls help – satya

+0

Sto modificando questa risposta ora. –

10

È possibile controllare la dimensione di un puntatore per determinare se è 32 bit o 64 bit.

int bits = IntPtr.Size * 8; 
Console.WriteLine("{0}-bit", bits); 
Console.ReadLine(); 
+3

Nel momento in cui questa risposta è stata pubblicata, non era molto chiara, ma l'OP voleva sapere come interrogare * un altro * processo piuttosto che il processo corrente. –

127

Se stai usando .Net 4.0, si tratta di un one-liner per il processo in corso:

Environment.Is64BitProcess 

Vedi Environment.Is64BitProcessProperty (MSDN).

+1

Potresti pubblicare il codice di 'Is64BitProcess'? Forse posso usare quello che fa per capire se sono in esecuzione come un processo a 64 bit. –

+1

@Ian, dubito che Sam sia legalmente autorizzato a pubblicare il codice MS su questo forum. Non sono sicuro del contenuto esatto della loro licenza di riferimento, ma sono abbastanza sicuro che proibisca la riproduzione del codice ovunque. – ProfK

+3

@Ian qualcuno ha fatto quel lavoro per te: http://stackoverflow.com/questions/336633/how-to-detect-windows-64-bit-platform-with-net/1913908#1913908 –

0

mi piace usare questo:

string e = Environment.Is64BitOperatingSystem 

In questo modo se ho bisogno di trovare o verificare un file che posso facilmente scrivere:

string e = Environment.Is64BitOperatingSystem 

     // If 64 bit locate the 32 bit folder 
     ? @"C:\Program Files (x86)\" 

     // Else 32 bit 
     : @"C:\Program Files\"; 
+13

che dire del processo a 32 bit nella macchina con sistema operativo a 64 bit? – Kiquenet

+2

Supponendo che la lettera di unità sia anch'essa sbagliata – Epirocks

+2

È davvero così difficile usare 'Environment.GetFolderPath (Environment.SpecialFolder.ProgramFilesX86)' invece di hard-coding 'C: \ Programmi \'? – Luaan

1

Ecco il controllo di una riga.

bool is64Bit = IntPtr.Size == 8; 
+4

L'OP ha chiesto specificamente come interrogare * un altro * processo, non il processo corrente. –

4
[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; 
} 
+2

L'OP ha chiesto in particolare come interrogare * un altro * processo, non il processo corrente. –

13

La risposta selezionato non è corretto in quanto non fa quello che è stato chiesto. Controlla se un processo è un processo x86 eseguito su sistema operativo x64; quindi restituirà "false" per un processo x64 su un sistema x64 OS o x86 in esecuzione su un sistema operativo x86.
Inoltre, non gestisce correttamente gli errori.

Ecco un metodo più corretto:

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

'Environment.GetEnvironmentVariable (" PROCESSOR_ARCHITECTURE ") ==" x86 "' restituirà sempre true per un processo a 32 bit. Meglio usare 'System.Environment.Is64BitOperatingSystem' se .NET4 è supportato –

+0

@Aizzat Suhardi, ok grazie. – user626528

Problemi correlati