2010-02-11 26 views
5

Tôi có một ứng dụng WinForms cần phải xử lý theo những cách cụ thể (đặc biệt là trình bao theo một trình cài đặt nhất định) dựa trên hệ điều hành mà nó đang chạy.Cách tốt nhất cho ứng dụng WinForms để xác định chính xác hệ điều hành Windows nào đang chạy?

Tôi đang sử dụng lớp System.OperatingSystem và kết hợp các số PlatFormID, Chính, Nhỏ và Xây dựng giúp bạn tận dụng tối đa cách đó.

Thật không may, sự thích hợp của đối tượng OperatinSystem, không cho phép bạn phân biệt chính xác giữa một số nền tảng. Ví dụ. Vista và Windows Server 2008, hoặc Vista 32 bit và Vista 64 bit. Tương tự như vậy, XP 64 bit Professional dường như có cùng thông tin phiên bản như Server 2003.

Vì vậy, có thể xác định chính xác hệ điều hành Windows nào bạn đang chạy, từ một ứng dụng WinForms (sử dụng C#)?

+1

XP 64 là Server 2003 cho tất cả các mục đích thực tế. Vì vậy, bạn chỉ cần một cách để nói với 64 bit từ 32 bit - phải không? –

+1

Kiểm tra điều này .... http: //stackoverflow.com/questions/57124/how-to-detect-true-windows-version – t0mm13b

Trả lời

4

Cách dễ nhất để phân biệt giữa 32bit và 64bit là thông qua biến môi trường PROCESSOR_ARCHITECTURE.

string value = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); 

nếu bạn chạy mã này trên 32 bit Windows, value sẽ là "x86" hoặc trống. Trên Windows 64bit, tôi cho rằng nó sẽ được đặt thành bất cứ thứ gì ngoài "x86". Loại lộn xộn nhưng cho đến nay nó hoạt động trên tất cả các phiên bản của Windows, nơi bạn có thể thực thi chương trình .NET. Bạn cũng có thể sử dụng WMI hiện đại hơn để truy vấn thực tế tất cả thông tin về hệ điều hành mà bạn có thể tưởng tượng nhưng điều này sẽ chỉ hoạt động trên Windows 2000 hoặc mới hơn. Nếu bạn có thể sống với điều đó, check this blog post for some examples.

+1

Cảm ơn bạn đã liên kết tới blog của tôi! +1 :-D –

2

Đây là điều tôi đã làm khoảng một năm trước cho một ứng dụng cũ tại công ty của tôi ... Tôi không biết rằng đó là phương pháp mới nhất, nhưng nó chắc chắn đã hoạt động.

If Environment.OSVersion.Platform = PlatformID.Win32NT Then 
     If major <= 4 Then 
      ret = "Windows NT 4.0" 
      _usingNT4 = True 
     ElseIf major > 6 Then 
      ret = "Windows Vista" 
     ElseIf major = 5 And minor = 0 Then 
      ret = "Windows 2000" 
     Else 
      ret = "Windows XP" 
     End If 
    Else 
     If major > 4 Or (major = 4 And minor >= 90) Then 
      ret = "Windows ME" 
     ElseIf (major = 4 And minor >= 10 And minor < 90) Then 
      ret = "Windows 98" 
     Else 
      ret = "Windows 95" 
     End If 
    End If 
+1

Cảm ơn. Tôi cũng đã sử dụng thông tin đó nhưng có một số xung đột khi cố gắng phân biệt giữa các lượt thích của Vista32 và Vista64, v.v. –

1

Nếu bạn thực sự cần tất cả các chi tiết, tôi đoán bạn vẫn có thể sử dụng tốt tuổi GetVersionEx của Win32 API.

Thực tế đây không phải là .NET (nói đúng), nhưng có thể sử dụng trong ứng dụng .NET. Xem here.

3

Bạn có thể sử dụng WMI để truy xuất thông tin cho lớp quản lý Win32_OperatingSystem.

Mã được tạo ra với WMI Code Creator:

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = 
        new ManagementObjectSearcher("root\\CIMV2", 
        "SELECT * FROM Win32_OperatingSystem"); 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Win32_OperatingSystem instance"); 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("BuildNumber: {0}", queryObj["BuildNumber"]); 
        Console.WriteLine("Caption: {0}", queryObj["Caption"]); 
        Console.WriteLine("OSArchitecture: {0}", queryObj["OSArchitecture"]); 
        Console.WriteLine("OSLanguage: {0}", queryObj["OSLanguage"]); 
        Console.WriteLine("Version: {0}", queryObj["Version"]); 
       } 
      } 
      catch (ManagementException e) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
      } 
     } 
    } 
} 
1

Đây là một cách đơn giản hơn:

string os = Environment.OSVersion.VersionString; 

... Đối với hệ điều hành của tôi, lợi nhuận trên như sau:

Microsoft Windows NT 6.1. 7600.0

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn. Tôi đã chơi với cài đặt này nhưng nó không phân biệt giữa 32 và 64 bit. Giải pháp của tôi sẽ kết thúc bằng cách sử dụng một chút của tất cả các câu trả lời mặc dù, do đó, nhờ tất cả mọi người. –

+0

Bạn được chào đón và tôi hy vọng bạn tìm được giải pháp. –

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