У меня есть приложение WinForms, которое должно вести себя в особенных методах (конкретно оболочка к определенному установщику) на основе операционной системы, в которой она работает.
Я использую Систему. Класс OperatingSystem и объединение PlatFormID, Главные, Незначительные и Номера сборки, который получает Вас большая часть пути там.
К сожалению, properites объекта OperatinSystem, не позволяйте Вам различать точно некоторые платформы. Например, Vista и Windows Server 2008, или Vista 32 бита и Vista 64 бита. Аналогично, у Профессионала XP 64 битов, кажется, есть та же информация об управлении версиями как Сервер 2003.
Таким образом, действительно ли возможно определить точно, на какой операционной системе Windows Вы работаете из Приложения WinForms (использующий c#)?
Самый простой способ отличить 32bit от 64bit - это переменная окружения PROCESSOR_ARCHITECTURE
.
string value = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
если вы запустите этот код на 32-разрядной Windows, значение
будет либо "x86", либо пустым. На 64-разрядных Windows, я полагаю, оно будет установлено в любое значение, кроме "x86". Это довольно сложно, но пока что это работает на всех версиях Windows, где можно выполнить программу .NET.
Вы также можете использовать более современный WMI для запроса практически всей информации об операционной системе, которую вы можете себе представить, но это будет работать только на Windows 2000 или более новых версиях. Если вы можете с этим смириться, посмотрите несколько примеров в этом блоге.
Если вам действительно нужны все детали, я думаю, вы все еще можете использовать старый добрый GetVersionEx из Win32 API.
На самом деле это не .NET (строго говоря), но может использоваться в приложении .NET. См. здесь.
Это то, что я сделал около года назад для унаследованного приложения в моей компании... Я не знаю, что это самый современный метод, но он определенно сработал.
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
Вы можете использовать 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);
}
}
}
}
Вот более простой способ:
string os = Environment.OSVersion.VersionString;
... Для моей ОС вышеприведенный способ дает следующее:
Microsoft Windows NT 6.1.7600.0
Надеюсь, это поможет.