Определение типа архитектуры процессора с использованием C # - PullRequest
18 голосов
/ 20 апреля 2009

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

Ответы [ 13 ]

26 голосов
/ 20 апреля 2009

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

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
22 голосов
/ 07 мая 2012

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

bool is64 = System.Environment.Is64BitOperatingSystem
10 голосов
/ 27 августа 2012

Вот фрагмент кода, который работает (на основе 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;
    }

Обратите внимание, что этот код повторно использует существующую CLR ProcessorArchitecture enum и поддерживает .NET Framework 2 и выше.

6 голосов
/ 20 апреля 2009

Win32_Processor Класс WMI сделает эту работу. Используйте MgmtClassGen.exe для создания оболочек со строгим типом.

5 голосов
/ 13 августа 2014

Наконец, самый короткий трюк для определения архитектуры платформы / процессора для текущей рабочей среды 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.
4 голосов
/ 28 июля 2017

Я знаю, что этот вопрос из прошлого, но с 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

1 голос
/ 03 ноября 2014

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

1 голос
/ 20 апреля 2009

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

0 голосов
/ 19 декабря 2017

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

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: еще не проверено.

0 голосов
/ 15 февраля 2012

Мне кажется, это самое простое:

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