2009-03-27 9 views

risposta

5

è possibile interrogare il WMI classe Win32_Processor utilizzando System.Management.ManagementObject:

ManagementObject mo; 
mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'"); 
ushort i = (ushort)mo["Architecture"]; 

switch (i) 
{ 
case 0: 
    return "32 Bit"; 
    break; 
case 9: 
    return "64 Bit"; 
    break; 
} 

Date un'occhiata a the MSDN Library description per altri codici del processore.

Un problema con questo è che l'utente, che esegue il programma, ha bisogno di privilegi per la visualizzazione del WMI.

+2

Posso interrogare la classe Win32_Processor (da PowerShell) perfettamente senza privilegi amministrativi. Inoltre, è possibile eseguire query su AddressWidth/DataWidth anziché su architettura perché l'architettura 6 (Itanium) sarebbe anch'essa a 64 bit. Non dare per scontato che ci siano solo x86 e x86_64. – Joey

5

Il modo più semplice per controllare in modo nativo in C# è:

var size = IntPtr.Size; 

dimensioni sarà uguale a 4 o 8, ma il problema più grande è il motivo per cui avete bisogno di sapere?

+4

Questo non indica il tipo di processore, ma solo l'applicazione corrente. – Guffa

2

Se si desidera solo scoprire se l'applicazione corrente è in esecuzione come un'applicazione a 32 bit o un'applicazione a 64 bit, è sufficiente utilizzare la proprietà IntPtr.Size.

int bits = IntPtr.Size * 8; 

Per trovare informazioni sul processore reale è più difficile. Here is a library che ottiene alcune informazioni, ma la pagina non dice se ottiene quelle informazioni specifiche. È possibile get some information from the registry, non ho controllato quante informazioni ci sono.

2

È anche possibile utilizzare P/Invoke per chiamare GetNativeSystemInfo e ottenere una struttura SystemInfo.

Un'altra soluzione si presenta così:

isWow64 = false; 
if (System.Environment.OSVersion.Version.Major >= 5 && 
    System.Environment.OSVersion.Version.Minor >= 1) 
{ 
    var processHandle = GetProcessHandle((uint) 
      System.Diagnostics.Process.GetCurrentProcess().Id); 
    bool retVal; 
    if (!NativeMethods.IsWow64Process(processHandle, out retVal)) 
    { 
    throw (new Win32Exception()); 
    } 
    isWow64 = retVal; 
} 

soluzione alternativa (ma non consigliato) :)

public bool Is64bitOS 
{ 
    get 
    { 
     return Environment.GetEnvironmentVariable("ProgramFiles(x86)") 
       != null; 
    } 
} 

public string ProgramFilesX86 
{ 
    get 
    { 
     string programFiles = 
      Environment.GetEnvironmentVariable("ProgramFiles(x86)"); 
     if (programFiles == null) 
     { 
      programFiles = Environment.GetEnvironmentVariable(
          "ProgramFiles"); 
     } 

     return programFiles; 
    } 
} 
3

È possibile ottenere la CPU (e altro) informazioni dal registro:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor 

Dispone di 1 o più sottochiavi (uno per ciascun core) chiamati 0, 1, 2, ecc. Ciascuna sottochiave contiene informazioni sul nucleo, incluso l'identificatore che contiene x86 o 64 bit nel testo, inclusi famiglia e modello del processore.

+0

Questo è corretto, ma solo su macchine Windows. Non penso che funzionerà per le app Silverlight, Phone 7 o per le app in esecuzione su mono/linux. – matt

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

Cosa c'è di sbagliato in Environment.Is64BitOperatingSystem? –

Problemi correlati