2009-04-20 3 views
17

Я хочу проверить, какая архитектура ЦП является пользователем, это i386 или X64 или AMD64. Я хочу сделать это на C#. Я знаю, что могу попробовать WMI или реестр. Есть ли другой путь, кроме этих двух? Мой проект нацелен на .NET 2.0!Идентификация типа архитектуры процессора с использованием C#

ответ

25

Вы также можете попробовать (работает только если это не манипулировали):

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") 
+1

что делать, если он не установлен? –

+0

Не задано для «манипулируемого» случая (по крайней мере, в Vista, оно установлено по умолчанию). Я предложил это альтернативным способом, не обязательно лучшим способом. –

+0

хороший ответ. –

0

Возможно, вы можете задать вопрос пользователю?

Просто шучу, конечно ... Я думаю, что WMI - это то, что вы использовали бы для этого. Но может быть, есть и другой способ?

Если вы идете на WMI, то LinqToWmi может быть полезен. Я попробовал это один раз, и это показалось довольно прямым. =) ->http://www.codeplex.com/linq2wmi

6

Win32_Processor WMI Class выполнит эту работу. Используйте MgmtClassGen.exe для создания сильно типизированных оберток.

+2

Это, вероятно, лучший ответ на вопрос. –

+0

Это очень помогло мне! спасибо и +1! –

+0

Как класс Win32_Processor должен помочь? если вы говорили об OSArchitecture, то это свойство недоступно в большинстве версий Windows, только поддержка нескольких последних версий. – ivan

1

Может this CodeProject статья может помочь? Он использует ManagementObjectSearcher в пространстве имен System.Management для поиска информации об оборудовании.

0

Я считаю, что вам следует избегать тяжелых наворотов, таких как WMI и LINQ .., и вам придется в конечном итоге получить дополнительную информацию по мере продвижения, ни одна из которых не удовлетворена раздутыми apis и фреймами.

Просто вызовите DLL, которая вызывает и извлекает информацию CPUID. C++/CLI или pinvoke будут делать и получать всю необходимую информацию у поставщика. Сначала вам нужно узнать, поддерживается ли инструкция (в 99% случаев).

Чтобы быстро запустить и запустить, проверьте сайт intel для образца Wincpuid и извлеките его из cpuid.h. Есть только 2 поставщика, и один хорош с задержкой памяти, а другой - нет (как собственный управляемый код). Таким образом, у вас будут проблемы с Mono на других архитектурах и т. Д. (Кто не знает об этом). Что же касается x64, вы уже знаете это или просто получить CorFlags (его там уже и убивает своего клиента жесткий диск с распределением .NET) ..

(http://software.intel.com/en-us/articles/api-detects-ia-32-and-x64-platform-cpu-characteristics/)

+0

Спасибо за уже высказывая мысль У меня было (что вызвало стон), когда я прочитал предложение об использовании WMI. –

+0

Ваша ссылка на intel.com теперь мертва. –

-3

Вот что я сделал:

public static bool Isx86() 
{ 
    return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0); 
} 

Если вы используете 64-битную архитектуру, у вас будет две переменные env файла программы. Если вы на x86, у вас будет только один.

+0

Ужасно, если все, о чем вы заботитесь, это 32bit vs 64 bit aka x86 vs x64, просто используйте следующее свойство BCL Environment.Is64BitOperatingSystem –

-1

Это, кажется, самый простой для меня:

System.Environment.Is64BitOperatingSystem 
+2

доступно в .NET 4.0, в то время как вопрос о .NET 2.0 – ivan

16

Что привело меня сюда проверяет на 32 против 64-битных ОС. наивысший рейтинг отвечает за настройку для Текущий процесс. После того, как я не нашел ответа, я нашел следующую настройку. Надеюсь, что это работает для вас.

bool is64 = System.Environment.Is64BitOperatingSystem 
+4

Поддерживается только в .NET Framework 4+ –

+1

Извините, что возродил старый поток, но как совет будущему читателю: поскольку 32-разрядный процесс может успешно работать в 64-битной ОС, 'System.Environment.Is64BitProcess' был более полезен в моем случае (установите' PATH' для «правильного» 'sqlite3.dll' на основе архитектуры). В моем случае ОС была действительно 64-битной, но из-за другой библиотеки мне пришлось скомпилировать мое приложение как 32-битное. – nurchi

+0

Is64BitProcess не отображался, по крайней мере, до версии 4. Для любой версии, я думаю, что IntPtr.Size является самым элегантным решением; Я включил в код тройное выражение в коде, который привел меня на эту страницу. –

9

Вот кусок кода, который, кажется, работает (на основе P/Invoke):

public static ProcessorArchitecture GetProcessorArchitecture() 
    { 
     SYSTEM_INFO si = new SYSTEM_INFO(); 
     GetNativeSystemInfo(ref si); 
     switch (si.wProcessorArchitecture) 
     { 
      case PROCESSOR_ARCHITECTURE_AMD64: 
       return ProcessorArchitecture.Amd64; 

      case PROCESSOR_ARCHITECTURE_IA64: 
       return ProcessorArchitecture.IA64; 

      case PROCESSOR_ARCHITECTURE_INTEL: 
       return ProcessorArchitecture.X86; 

      default: 
       return ProcessorArchitecture.None; // that's weird :-) 
     } 
    } 

с

[DllImport("kernel32.dll")] 
    private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); 

    private const int PROCESSOR_ARCHITECTURE_AMD64 = 9; 
    private const int PROCESSOR_ARCHITECTURE_IA64 = 6; 
    private const int PROCESSOR_ARCHITECTURE_INTEL = 0; 

    [StructLayout(LayoutKind.Sequential)] 
    private struct SYSTEM_INFO 
    { 
     public short wProcessorArchitecture; 
     public short wReserved; 
     public int dwPageSize; 
     public IntPtr lpMinimumApplicationAddress; 
     public IntPtr lpMaximumApplicationAddress; 
     public IntPtr dwActiveProcessorMask; 
     public int dwNumberOfProcessors; 
     public int dwProcessorType; 
     public int dwAllocationGranularity; 
     public short wProcessorLevel; 
     public short wProcessorRevision; 
    } 

Примечание Этот код повторно ProcessorArchitecture перечисление существующего CLR, в и поддерживает .NET framework 2 и выше.

+0

Спасибо, что отлично работает ... Я ожидаю, что тип машины не тип ОС. –

+0

Саймон, это, безусловно, самое скудное решение. Каждый, кто боится Платформы Invoke, преодолевает это; он не (обычно) кусается! –

5

Наконец самый короткий трюк, чтобы решить архитектуру платформы/процессор для текущей среды выполнения работает CLR в C# является:

PortableExecutableKinds peKind; 
ImageFileMachine machine; 
typeof(object).Module.GetPEKind(out peKind, out machine); 

Здесь Module.GetPEKind возвращает ImageFileMachine перечисление, которое существует, так как .NET v2:

public enum ImageFileMachine 
{ 
    I386 = 0x014C, 
    IA64 = 0x0200, 
    AMD64 = 0x8664, 
    ARM  = 0x01C4 // new in .NET 4.5 
} 

Почему бы не использовать new AssemblyName(fullName) или typeof(object).Assembly.GetName()?
Ну есть этот HACK комментарий в исходном коде ASP.NET MVC (начиная с версии 1.0):

private static string GetMvcVersionString() { 
    // DevDiv 216459: 
    // This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in 
    // medium trust. However, Assembly.FullName *is* accessible in medium trust. 
    return new AssemblyName(typeof(MvcHttpHandler).Assembly.FullName).Version.ToString(2); 
} 

См они используют некоторые скрытые трюки для себя. К сожалению, конструктор AssemblyName не устанавливает поле ProcessorArchitecture соответствующим образом, это всего лишь None для любого нового AssemblyName.

Итак, для будущих читателей позвольте мне рекомендовать вам использовать этот уродливый GetPEKind с ImageFileMachine!

Примечания:

  • Это возвращает текущий ход выполнения архитектуры, а не базовая архитектура системы!
    Тем не менее, единственным исключением является то, что среда выполнения I386 может работать в системе AMD64.
  • Протестировано на mono/ubuntu 14.04/AMD64 и .NET/Win7/I386.
0

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

+0

Мне нравится, как думает Anonymous Coward! –

2

Я знаю, что этот вопрос из прошлого, но по состоянию на 2017 год, теперь есть простой способ узнать архитектуру текущего процесса, в стандарте .net:

System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture 

Возвращаемое значение один из X86, X64, ARM, ARM64 и дает архитектуру процесса, в котором он запущен. OSArchitecture вместо этого возвращает архитектуру установленной операционной системы.

Ссылки на документы (довольно бесполезные, хотя ...):

RuntimeInformation.ProcessArchitecture: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.runtimeinformation.processarchitecture?view=netstandard-1.4

Архитектура перечисление: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=netstandard-1.4

0

Как насчет этого?

switch (typeof(string).Assembly.GetName().ProcessorArchitecture) { 
    case System.Reflection.ProcessorArchitecture.X86: 
     break; 
    case System.Reflection.ProcessorArchitecture.Amd64: 
     break; 
    case System.Reflection.ProcessorArchitecture.Arm: 
     break; 
} 

Однако case *.Arm: еще не проверен.

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