Какой самый надежный способ определения архитектуры ОС Windows (x86, x64) в .NET 2.0 - PullRequest
1 голос
/ 01 июня 2010

Я использую Visual C # 2010 Express, и мне нужен самый надежный способ (при нажатии кнопки) и в среде .NET 2.0, чтобы определить, является ли Windows в настоящее время x86 или x64 в окне сообщения ... до сих пор я использовал этот код, но мне нужно знать, если есть более точный способ?

        string target = @"C:\Windows\SysWow64";
        {
            if (Directory.Exists(target))
            {
               MessageBox.Show("x64");
            }
            else
            {
               MessageBox.Show("x86");
            }

Ответы [ 5 ]

9 голосов
/ 01 июня 2010

Самым простым тестом является проверка размера IntPtr:

        if (IntPtr.Size == 8)
        {
           MessageBox.Show("x64");
        }
        else
        {
           MessageBox.Show("x86");
        }

Предполагается, что вы создаете свой EXE-файл с установленной по умолчанию целью платформы «Любой процессор». Помните, что это значение по умолчанию изменилось в VS2010.

7 голосов
/ 01 июня 2010

Вы можете использовать переменную среды PROCESSOR_ARCHITECTURE ...

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

Будет возвращено одно из: x86, AMD64, IA64.

Возможно, вас интересуют только значения x86 и AMD64, IA64 не очень популярен и не будет поддерживаться Microsoft в будущем. Это для процессоров Itanium и Itanium 2.

Другой простой способ - посмотреть в реестре, существует ли SOFTWARE\Wow6432Node для HKLM или HKCU.

.
6 голосов
/ 29 ноября 2012

Я думаю, что лучше всего использовать: System.Environment.Is64BitOperatingSystem.

4 голосов
/ 01 июня 2010

Это было какое-то время. Я верю, что он совместим с .NET 2.0, но я не совсем уверен. Вероятно, вас интересуют только случаи 0 и 9 (в любом случае, они наиболее распространены).

public static string GetCpuArch()
{
    ManagementScope scope = new ManagementScope();
    ObjectQuery query = new ObjectQuery("SELECT Architecture FROM Win32_Processor");
    ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection results = search.Get();

    ManagementObjectCollection.ManagementObjectEnumerator e = results.GetEnumerator();
    e.MoveNext();
    ushort arch = (ushort)e.Current["Architecture"];

    switch (arch)
    {
        case 0:
            return "x86";
        case 1:
            return "MIPS";
        case 2:
            return "Alpha";
        case 3:
            return "PowerPC";
        case 6:
            return "Itanium";
        case 9:
            return "x64";
        default:
            return "Unknown Architecture (WMI ID " + arch.ToString() + ")";
    }
}
2 голосов
/ 14 июля 2011

Переменная среды PROCESSOR_ARCHITECTURE содержит адресную ширину запущенного процесса, которая не обязательно совпадает с шириной операционной системы или процессоров. Быстрый способ убедиться в этом - выполнить следующую команду ...

$Env:PROCESSOR_ARCHITECTURE

... в 32- и 64-разрядных сеансах PowerShell и сравнении результатов.

Итак, если GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") возвращает "AMD64", то у вас определенно есть 64-битный процесс, операционные системы и процессоры. Если он вернет "x86", то у вас определенно будет 32-разрядный процесс, хотя вы все равно не будете знать, являются ли операционная система и процессоры 32- или 64-разрядными.

Если вы действительно стремитесь к ширине адреса операционной системы, тогда .NET 4 предлагает свойство Environment.Is64BitOperatingSystem . Вы также можете использовать WMI в любой версии .NET для чтения свойства OSArchitecture класса Win32_OperatingSystem :

static string GetOSArchitecture()
{
    var query = new WqlObjectQuery("SELECT OSArchitecture FROM Win32_OperatingSystem");

    using (var searcher = new ManagementObjectSearcher(query))
    using (var results = searcher.Get())
    using (var enumerator = results.GetEnumerator())
    {
        enumerator.MoveNext();

        return (string) enumerator.Current.GetPropertyValue("OSArchitecture");
    }
}

... хотя, к сожалению, свойство OSArchitecture существует только в Windows Vista / Server 2008 и более поздних версиях.

Для всех версий Windows, начиная с 2000 года, вы можете попробовать p / вызвать функцию GetSystemInfo () и проверить wProcessorArchitecture член структуры SYSTEM_INFO .

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