PROCESSOR_ARCHITECTURE возвращает AMD64 в некоторых 32-битных процессах - PullRequest
4 голосов
/ 11 ноября 2010

Я столкнулся со странным сценарием, в котором 32-разрядный процесс утверждает, что его PROCESSOR_ARCHITECTURE - AMD64, вызывая сбой в компонентах, которые принимают решения на основе этого флага.

Я выделил его на следующие шаги:

  • В VS2010 создайте проект библиотеки
  • На вкладке Свойства проекта / Отладка установите для параметра Запускать внешнюю программу значение VS exe (например, C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \Common7 \ IDE \ devenv.exe)
  • Выполните Ctrl-F5, чтобы запустить другой экземпляр VS
  • Во втором случае создайте приложение консоли и вставьте следующий код

In Main:

Console.WriteLine(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"));
Console.ReadLine();
  • Теперь запустите консольное приложение

И оно отображает AMD64, хотя это 32-битный процесс (по умолчанию дляКонсольные приложения, в соответствии с настройками сборки).

Вопрос : могут ли другие также повторить это, и если да, то можете ли вы объяснить это?

Примечание: если вам интереснопричина, по которой я запускаю VS таким образом, в том, что я использую экспериментальнуюкуст для второго экземпляра

ОБНОВЛЕНИЕ: обратите внимание, что в моем реальном сценарии я сам не ищу эту переменную среды.Вместо этого я использую компонент (SQLCE), который ищет его и полагается на его правильность.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Это не дает прямого ответа на ваш вопрос, но почему вы просто не протестируете значение IntPtr.Size?Если это 4, то вы 32-битный, если 8, то вы 64-битный.

.NET Framework 4 также имеет Is64BitProcess и Is64BitOperatingSystem свойства, которые определенно могли бы стать движением вперед ...

1 голос
/ 11 ноября 2010

Основываясь на своих выводах, я думаю, что могу придумать разумное объяснение этому.

Если для проекта задано целевое значение «Любой ЦП» (по умолчанию для библиотек классов), для переменной среды PROCESSOR_ARCHITECTURE будет установлено то, что наиболее эффективно при запуске внешнего процесса, «AMD64» для 64-разрядной ОС , Однако поскольку Visual Studio IDE на самом деле является 32-разрядным процессом, работающим с WOW, это может привести к путанице с процессами, запущенными из второго экземпляра.

Принудительное нацеливание библиотеки на 32-битную платформу приведет к правильной настройке, которую я нашел. Возможно, тебе следует это сделать.

0 голосов
/ 11 ноября 2010

Из того, что я знаю, PROCESSOR_ARHITECTURE это не аппаратный процессор, это относится к процессору, для которого было создано программное обеспечение ОС.

Поскольку AMD была первой, кто создал 64-битную архитектуру (x86-64), Microsoft включила в нее поддержку ОС и оставила название, которое изначально ей дала AMD. AMD64 и Intel64 фактически ссылаются на одну и ту же архитектуру x86-64, поэтому они совместимы.

Вы можете, например, попытаться получить PROCESSOR_IDENTIFIER и выяснить тип процессора из информации, содержащейся в этом.

Кто-то может поправить меня, если я ошибаюсь.

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