Каков наилучший способ для приложения WinForms точно определить, на какой операционной системе Windows оно работает? - PullRequest
5 голосов
/ 11 февраля 2010

У меня есть приложение WinForms, которое должно вести себя определенным образом (в частности, оболочка для определенного установщика) в зависимости от операционной системы, в которой оно работает.

Я использую класс System.OperatingSystem и объединяю номера PlatFormID, Major, Minor и Build, что помогает вам в этом.

К сожалению, свойства объекта OperatinSystem не позволяют точно различать некоторые платформы. Например. Vista и Windows Server 2008 или Vista 32-разрядная и Vista 64-разрядная. Аналогично, XP 64-разрядная версия Professional, похоже, имеет ту же информацию о версиях, что и Server 2003.

Так можно ли точно определить, на какой операционной системе Windows вы работаете, из приложения WinForms (используя c #)?

Ответы [ 5 ]

4 голосов
/ 11 февраля 2010

Самый простой способ различить 32-битные и 64-битные - это переменные среды PROCESSOR_ARCHITECTURE.

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

если вы запустите этот код в 32-битной Windows, value будет либо "x86", либо пустым. На 64-битной Windows я предполагаю, что он будет установлен на что угодно, кроме «x86». Это довольно грязно, но пока работает на всех версиях Windows, где вы можете запустить программу .NET.

Вы также можете использовать более современный WMI для запроса практически всей информации об операционной системе, которую вы можете себе представить, но это будет работать только в Windows 2000 или новее. Если вы можете жить с этим, проверьте это сообщение в блоге для некоторых примеров .

3 голосов
/ 11 февраля 2010

Вы можете использовать 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);
            }
        }
    }
}
2 голосов
/ 11 февраля 2010

Это было то, что я делал около года назад для устаревшего приложения в моей компании ... Я не знаю, что это самый современный метод, но он, безусловно, работал.

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 голос
/ 11 февраля 2010

Вот более простой способ:

string os = Environment.OSVersion.VersionString;

... Для моей ОС вышеприведенное возвращает следующее:

Microsoft Windows NT 6.1.7600.0

Надеюсь, это поможет.

1 голос
/ 11 февраля 2010

Если вам действительно нужны все детали, я думаю, вы все еще можете использовать старый добрый GetVersionEx Win32 API.

На самом деле это не .NET (строго говоря), но может использоваться в приложении .NET. Смотри здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...