Я хочу проверить, какая архитектура процессора является пользователем, работает ли она i386 или X64 или AMD64. Я хочу сделать это на С#. Я знаю, что могу попробовать WMI или реестр. Есть ли другой путь, кроме этих двух? Мой проект нацелен на .NET 2.0!
Определение типа архитектуры ЦП с использованием С#
Ответ 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, у вас будет только один.