Подтвердить что ты не робот

Определение типа архитектуры ЦП с использованием С#

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

4b9b3361

Ответ 1

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

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

Ответ 2

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

bool is64 = System.Environment.Is64BitOperatingSystem

Ответ 3

Вот фрагмент кода, который, кажется, работает (на основе 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 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 и выше.

Ответ 4

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

Ответ 5

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

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.

Ответ 6

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

Ответ 7

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

Ответ 8

Вы могли бы спросить пользователя, возможно?

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

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

Ответ 9

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

Просто вызовите DLL, которая вызывает и извлекает информацию CPUID. С++/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/)

Ответ 10

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

Ответ 11

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

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

Ответ 12

Это кажется мне самым простым:

System.Environment.Is64BitOperatingSystem

Ответ 13

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

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

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