2009-03-27 7 views

Respuesta

5

Usted puede consultar la clase WMIWin32_Processor usando 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; 
} 

Tome un vistazo a the MSDN Library description los códigos de otros procesadores.

Un problema con esto es que el usuario que ejecuta el programa necesita privilegios para ver el WMI.

+2

Puedo consultar la clase Win32_Processor (desde PowerShell) sin problemas, sin privilegios administrativos. También podría consultar el ancho de la dirección/ancho de datos en lugar de la arquitectura, porque la arquitectura 6 (Itanium) también sería de 64 bits. No suponga que solo hay x86 y x86_64 por ahí. – Joey

5

La forma más sencilla de comprobar de forma nativa en C# es:

tamaño
var size = IntPtr.Size; 

será igual a 4 o 8 pero la gran pregunta es ¿Por qué necesita saber?

+4

Eso no indica qué tipo de procesador es, solo con qué se ejecuta la aplicación actual. – Guffa

2

Si solo quiere saber si la aplicación actual se está ejecutando como una aplicación de 32 bits o una de 64 bits, simplemente use la propiedad IntPtr.Size.

int bits = IntPtr.Size * 8; 

Para encontrar información sobre el procesador real es más difícil. Here is a library que obtiene cierta información, pero la página no dice si recibe esa información específica. Puede get some information from the registry, no he comprobado cuánta información hay.

2

También puede usar P/Invoke para llamar al GetNativeSystemInfo y obtener una estructura SystemInfo.

Otra solución es similar a esto:

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

solución alternativa (pero no se recomienda) :)

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

Usted puede obtener la CPU (y más información del registro:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor 

Tiene 1 o más subclaves (uno para cada núcleo) llamados 0, 1, 2, etc. Cada subclave contiene información sobre el núcleo que incluye el Identificador que contiene x86 o algunos 64 bits de texto, incluida la familia de procesadores y el modelo.

+0

Esto es correcto, pero solo en máquinas con Windows. No creo que esto funcione para aplicaciones Silverlight, Phone 7 o aplicaciones que se ejecutan en 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

¿Qué pasa con Environment.Is64BitOperatingSystem? –

Cuestiones relacionadas