2009-03-27 30 views

Trả lời

5

Bạn có thể truy vấn các lớp WMIWin32_Processor sử dụng 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; 
} 

Hãy xem the MSDN Library description cho mã xử lý khác.

Sự cố với điều này là người dùng đang chạy chương trình cần có đặc quyền để xem WMI.

+2

Tôi có thể truy vấn lớp Win32_Processor (từ PowerShell) tốt mà không có quyền quản trị. Ngoài ra, bạn chỉ có thể truy vấn AddressWidth/DataWidth thay vì kiến ​​trúc vì kiến ​​trúc 6 (Itanium) cũng sẽ là 64 bit. Đừng cho rằng chỉ có x86 và x86_64. – Joey

5

Cách dễ nhất để natively kiểm tra trong C# là:

var size = IntPtr.Size; 

kích thước sẽ tương đương với 4 hoặc 8 nhưng câu hỏi lớn là tại sao bạn cần phải biết?

+4

Điều đó không cho bạn biết loại bộ xử lý là gì, chỉ những gì ứng dụng hiện tại đang chạy. – Guffa

2

Nếu bạn chỉ muốn tìm hiểu xem ứng dụng hiện có đang chạy dưới dạng ứng dụng 32 bit hay ứng dụng 64 bit, chỉ cần sử dụng thuộc tính IntPtr.Size.

int bits = IntPtr.Size * 8; 

Để tìm hiểu thông tin về bộ xử lý thực tế khó hơn. Here is a library nhận được một số thông tin, nhưng trang không cho biết liệu trang đó có nhận được thông tin cụ thể hay không. Bạn có thể get some information from the registry, tôi chưa kiểm tra xem có bao nhiêu thông tin.

2

Bạn cũng có thể sử dụng P/Gọi để gọi GetNativeSystemInfo và nhận cấu trúc SystemInfo.

Một giải pháp khác trông như thế này:

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

giải pháp thay thế (nhưng không khuyến khích) :)

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

Bạn có thể lấy CPU (và thêm) thông tin từ sổ đăng ký:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor 

Có 1 hoặc nhiều khóa con (một cho mỗi lõi) được gọi là 0, 1, 2 vv. Mỗi khóa con chứa thông tin trên lõi bao gồm Mã định danh chứa x86 hoặc 64 bit trong văn bản, bao gồm họ và mô hình xử lý.

+0

Điều này là chính xác, nhưng chỉ trên các máy cửa sổ. Tôi không nghĩ rằng điều này sẽ làm việc cho Silverlight, điện thoại 7 ứng dụng hoặc ứng dụng chạy trên 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

Có gì sai với Environment.Is64BitOperatingSystem? –

Các vấn đề liên quan