Является ли это хорошим способом определения архитектуры ОС?

Поскольку класс WMI Win32_OperatingSystem включает только OSArchitecture в Windows Vista, я быстро написал метод с использованием реестра, чтобы попытаться определить, является ли текущая система 32 или 64-битной.

private Boolean is64BitOperatingSystem()
{
    RegistryKey localEnvironment = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
    String processorArchitecture = (String) localEnvironment.GetValue("PROCESSOR_ARCHITECTURE");

    if (processorArchitecture.Equals("x86")) {
        return false;
    }
    else {
        return true;
    }
}

До сих пор это хорошо для нас работало, но я не уверен, как мне нравится просматривать реестр. Это довольно стандартная практика или есть лучший метод?

Изменить: Ого, этот код выглядит намного красивее в предварительном просмотре. В следующий раз я буду рассматривать связь с пастебином или что-то в этом роде.

Ответы

Ответ 1

Взгляните на решение Raymond Chens:

Как программно определить, работаете ли вы в 64-разрядной Windows.

и здесь PINVOKE для .NET:

IsWow64Process (kernel32)

Обновление: Я бы поставил вопрос с проверкой на "x86". Кто скажет, какой Intel или AMD следующий 32-разрядный процессор можно обозначить как. Вероятность низкая, но это риск. Вы должны попросить ОС определить это с помощью правильных API, а не путем запроса того, что может быть значением версии ОС/платформы, которое может считаться непрозрачным для внешнего мира. Задайте себе вопросы: 1 - соответствующая запись в реестре должным образом задокументирована MS, 2 - если это так, они предоставляют окончательный список возможных значений, которые гарантированно позволят вам как разработчику принять обоснованное решение о том, используете ли вы 32 бит или 64 бит. Если ответ отрицательный, тогда вызывается API, да, но он длиннее, но документирован и определен.

Ответ 2

Самый простой способ протестировать 64-разрядную версию .NET - проверить значение IntPtr.Size.

Я считаю, что значение IntPtr.Size равно 4 для 32-битного приложения, работающего под WOW, не так ли?

Изменить: @Edit: Да.:)

Ответ 3

Заглядывая в реестр, вполне допустимо, если вы можете быть уверены, что пользователь приложения всегда будет иметь доступ к тому, что вам нужно.

Ответ 4

Самый простой способ протестировать 64-разрядную версию .NET - проверить значение IntPtr.Size.

РЕДАКТИРОВАТЬ: Doh! Это покажет вам, является ли текущий процесс 64-разрядным, а не ОС в целом. Извините!