代码之家  ›  专栏  ›  技术社区  ›  Stuart Helwig

对于WinForms应用程序,确定其运行在哪个Windows操作系统上的最佳方法是什么?

  •  5
  • Stuart Helwig  · 技术社区  · 16 年前

    我有一个WinForms应用程序,它需要根据运行它的操作系统以特定的方式(特别是shell到某个安装程序)运行。

    我正在使用System.OperatingSystem类,并将平台、主要、次要和内部版本号组合在一起,这将使您获得最大的成功。

    不幸的是,OperatinSystem对象的属性不允许您精确地区分某些平台。例如,Vista和Windows Server 2008,或Vista 32位和Vista 64位。同样,xp 64位专业版似乎与server 2003具有相同的版本信息。

    那么,是否可以从Winforms应用程序(使用c)中准确确定正在运行的Windows操作系统?

    5 回复  |  直到 16 年前
        1
  •  4
  •   lubos hasko    16 年前

    区分32位和64位的最简单方法是通过环境变量 PROCESSOR_ARCHITECTURE .

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

    如果在32位Windows上运行此代码, value 将为“x86”或空。在64位的Windows上,我认为它将被设置为除“x86”之外的任何内容。有点混乱,但到目前为止,它适用于所有版本的Windows,您可以在其中执行.NET程序。

    您还可以使用更现代的WMI来查询几乎所有有关您能想象到的操作系统的信息,但这只适用于Windows 2000或更新版本。如果你能忍受的话, check this blog post for some examples .

        2
  •  3
  •   Thomas Levesque    16 年前

    您可以使用WMI检索 Win32_OperatingSystem 管理类。

    代码生成方式 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);
                }
            }
        }
    }
    
        3
  •  2
  •   Jon Ownbey    16 年前

    这是我一年前为公司的一个传统应用程序所做的……我不知道这是最新的方法,但确实有效。

    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
    
        4
  •  1
  •   rsenna    16 年前

    如果你真的需要所有的细节,我想你还是可以使用好的旧的 获取操作系统版本信息 Win32 API的。

    事实上,这不是.NET(严格来说),而是在.NET应用程序中可用的。见 here .

        5
  •  1
  •   anon271334    16 年前

    下面是一个简单的方法:

    string os = Environment.OSVersion.VersionString;
    

    …对于我的操作系统,上面返回以下内容:

    微软Windows NT 6.1.7600.0

    希望这有帮助。

    推荐文章