IntPtr.Size не вернет правильное значение, если работает в 32-битной .NET Framework 2.0 в 64-битной Windows (он вернет 32-битную).
Как описывает Microsoft Раймонд Чен, вы должны сначала проверить, выполняется ли в 64-битном процессе (я думаю, что в .NET вы можете сделать это, проверив IntPtr.Size), и если вы работаете в 32-битном процессе, вы все равно должны вызвать функцию Win API IsWow64Process. Если это возвращает true, вы работаете в 32-битном процессе в 64-битной Windows.
Рэймонд Чен из Microsoft:
Как программно определить, работаете ли вы на 64-битной Windows
Мое решение:
static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
public static bool InternalCheckIsWow64()
{
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
Environment.OSVersion.Version.Major >= 6)
{
using (Process p = Process.GetCurrentProcess())
{
bool retVal;
if (!IsWow64Process(p.Handle, out retVal))
{
return false;
}
return retVal;
}
}
else
{
return false;
}
}
System.Environment.Is64BitOperatingSystem
. Вы можете отредактировать это в своем ответе или дать мне разрешение отредактировать его в своем ответе?.NET 4 имеет два новых свойства в классе Environment: Is64BitProcess и Is64BitOperatingSystem . Интересно, что если вы используете Reflector, вы увидите, что они реализованы по-разному в 32-битной и 64-битной версиях mscorlib. 32-разрядная версия возвращает false для Is64BitProcess и вызывает IsWow64Process через P / Invoke для Is64BitOperatingSystem. 64-битная версия просто возвращает true для обоих.
источник
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
(псевдокод)Is64BitProcess
иIs64BitOperatingSystem
(ссылки для версии 2.0).Если вы используете .NET Framework 4.0, это легко:
См. Свойство Environment.Is64BitOperatingSystem (MSDN).
источник
Это всего лишь реализация того, что было предложено выше Бруно Лопесом, но работает на Win2k + все пакеты обновления WinXP. Просто решил, что я опубликую это, чтобы другие люди не катили его вручную. (написал бы как комментарий, но я новый пользователь!)
источник
Полный ответ таков (взят из обоих ответов stefan-mg, ripper234 и BobbyShaftoe):
Сначала проверьте, если вы находитесь в 64-битном процессе. Если нет, проверьте, является ли 32-битный процесс Wow64Process.
источник
Microsoft поместила пример кода для этого:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
Это выглядит так:
Также доступна версия WMI (для тестирования удаленных машин).
источник
Вы также можете проверить
PROCESSOR_ARCHITECTURE
переменную среды.Он либо не существует, либо установлен на «x86» в 32-битной Windows.
источник
prefer 32-bit
сAny CPU
как ваш ,Platform Target
то вы получитеx86
, но если вы снимите выделениеPrefer 32-bit
его вы потом получитеAMD64
.Из блога Chriz Yuen
C # .Net 4.0 Введено два новых свойства среды Environment.Is64BitOperatingSystem; Environment.Is64BitProcess;
Пожалуйста, будьте осторожны при использовании обоих этих свойств. Тест на Windows 7 64bit Machine
источник
Самый быстрый способ:
Примечание: это очень прямолинейно и работает правильно на 64-битной версии, только если программа не форсирует выполнение как 32-битный процесс (например,
<Prefer32Bit>true</Prefer32Bit>
в настройках проекта).источник
Попробуй это:
источник
@foobar: Вы правы, это слишком просто;)
В 99% случаев разработчики со слабым опытом работы с системными администраторами в конечном итоге не осознают всю мощь, которую Microsoft всегда предоставляла любому для перечисления Windows.
Системные администраторы всегда будут писать более качественный и простой код, когда дело доходит до такой точки.
Тем не менее, стоит отметить, что конфигурация сборки должна быть AnyCPU, чтобы эта переменная среды возвращала правильные значения в правильных системах:
Это вернет «X86» в 32-битной Windows и «AMD64» в 64-битной Windows.
источник
Использование dotPeek помогает увидеть, как на самом деле это делает фреймворк. Имея это в виду, вот что я придумал:
Пример использования:
источник
Используйте эти две переменные окружения (псевдокод):
Обратитесь к сообщению в блоге HOWTO: Обнаружение битности процесса .
источник
Я успешно использовал эту проверку на многих операционных системах:
Эта папка всегда называется «SysWOW64», независимо от языка операционной системы. Это работает для .NET Framework 1.1 или выше.
источник
SysWOW64
на%windir%
на 32 разрядной ОС? Наличие папки означает именно то, что папка присутствует.Мне нужно сделать это, но я также должен уметь как администратор делать это удаленно, в любом случае, мне кажется, это работает очень хорошо:
источник
Это решение основано на коде Microsoft по адресу http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 . Он использует методы расширения для легкого повторного использования кода.
Некоторое возможное использование показано ниже:
источник
Вот прямой подход в C # с использованием DllImport с этой страницы .
источник
IsWow64Process
как не существует.Я использую следующий код. Примечание: это сделано для проекта AnyCPU.
источник
Я обнаружил, что это лучший способ проверить платформу системы и процесс:
Первое свойство возвращает true для 64-битной системы и false для 32-битной. Второе свойство возвращает true для 64-битного процесса и false для 32-битного.
Необходимость в этих двух свойствах заключается в том, что вы можете запускать 32-битные процессы в 64-битной системе, поэтому вам нужно будет проверить и систему, и процесс.
источник
Все хорошо, но это также должно работать из
env
:..
Слишком легко, может быть ;-)
источник
Вот подход инструментария управления Windows (WMI):
источник
OSInfo.Bits
источник
Включите следующий код в класс в вашем проекте:
Используйте это так:
источник
Используйте это, чтобы получить установленную архитектуру Windows:
источник
Учитывая, что принятый ответ очень сложен. Есть более простые способы. Мой вариант вариации александрудику. Учитывая, что 64-битные окна устанавливают 32-битные приложения в Program Files (x86), вы можете проверить, существует ли эта папка, используя переменные среды (чтобы компенсировать различные локализации)
например
Это для меня быстрее и проще. Учитывая, что я также хочу получить доступ к определенному пути в этой папке в зависимости от версии ОС.
источник
Наслаждаться ;-)
источник
Просто посмотрите, существует ли «C: \ Program Files (x86)». Если нет, то вы находитесь на 32-битной ОС. Если это так, то ОС является 64-разрядной (Windows Vista или Windows 7). Это кажется достаточно простым ...
источник
Я использую:
Это дает путь к запуску приложения, если оно установлено в разных местах на компьютере. Кроме того, вы можете просто сделать общий
C:\
путь, поскольку на 99,9% компьютеров установлена WindowsC:\
.источник
Я использую версию следующего:
источник