2013-11-21 5 views
0

Я работаю над приложением, которое должно иметь возможность запускать 1 из 2 сценариев, в зависимости от того, работает ли ОС под управлением x64 или x86.Можно ли определить бит ОС из CPU?

Искал вокруг, и я наткнулся на эту тему: How to detect Windows 64-bit platform with .NET?

Но, видимо, мой босс боится верхний ответ не может работать на всех ОС»наши пользователи будут работать под управлением (XP/Vista/7). Он рекомендовал этот образец кода:

private void GetCpuDetails(out string cpuType) 
    { 
     cpuType = "..."; 

     try 
     { 
      using (RegistryKey regKey = Registry.LocalMachine) 
      { 
       using (RegistryKey subRegKey = regKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0")) 
       { 
        if (subRegKey.GetValue("ProcessorNameString") != null) 
        { 
         cpuType = subRegKey.GetValue("ProcessorNameString").ToString(); 
        } 

        subRegKey.Close(); 
       } 
       regKey.Close(); 
      } 
     } 
     catch 
     { 
      cpuType = "..."; 
     } 
    } 

Но я не понимаю, как вы могли бы определить версию ОС от CPU. Это похоже на ту же загадку, что и при использовании PROCESSOR_ARCHITECTURE, поскольку вы получите 64 или 32 бит на основе ЦП, а не ОС.

+0

Я думаю, вы можете использовать свойство 'System.Environment.Is64BitOperatingSystem', оно вернет true, если os 64 бит otheriwise false. –

+0

@Sudhakar Что нового в .NET 4.0, не существует в .NET 3.5 – sab669

+0

: К сожалению, я не видел тег Framework.Спасибо за ваш вопрос. –

ответ

5

Нет, это невозможно определить только из CPU. 64-битные процессоры предназначены для запуска 32-разрядных операционных систем, и поэтому знание того, какой у вас процессор, недостаточно, чтобы узнать, какая у вас операционная система.

Это особенно верно, потому что почти все процессоры, созданные за последние несколько лет, являются 64-битными, и это было достаточно долго, так как теперь становится необычным (и все больше и больше) находить 32- разрядных ПК, которые все еще находятся в эксплуатации. Тем не менее, многие поставщики ПК по-прежнему поставляются с предустановленной 32-битной Windows. Я бы не удивился, узнав, что для чисто случайной выборки ПК проверка типа CPU для получения информации об операционной системе в настоящее время более вероятна, чтобы дать вам неправильный ответ, чем правильный.

Лучший метод, который я видел, для определения типа операционной системы является described by Raymond Chen и adpated для C# в этом переполнения стека вопрос, что вы уже видели:

How to detect Windows 64-bit platform with .NET?

То есть правильный способ сделать это для .Net до .Net 4.0. Для 4.0 и более поздних версий, вы можете, конечно, просто проверить System.Environment.Is64BitOperatingSystem, как указано в комментарии.

1

Почему вы не просто проверяете IntPtr.Size, чтобы определить, работает ли ваше приложение в режиме x64 или x86?

Он будет вводить вас в заблуждение, если вы находитесь на WoW64, но, может быть, это может быть хорошо в вашем сценарии?

Для уточнения: Посмотрите на пример в ответ Antonijn в Load x64 or a x86 DLL depending upon the platform?

Тип Interop = (IntPtr.Size == 8)? typeof (Foo64): typeof (Foo32);

Или ответ Мэя:

(IntPtr.Size == 4)? «x86»: «x64»

Я использовал этот подход много раз.

+0

К сожалению, из-за библиотеки сторонних разработчиков, которую мы используем, я вынужден установить Build Target как x86, поэтому IntPtr.Size - это 4 независимо от платформы, на которой она фактически работает. Если это может быть AnyPlatform, я уверен, что это сработает, хотя у моего босса тоже есть проблема с этим ... – sab669

Смежные вопросы