Я хочу проверить, какая архитектура ЦП является пользователем, это i386 или X64 или AMD64. Я хочу сделать это на C#. Я знаю, что могу попробовать WMI или реестр. Есть ли другой путь, кроме этих двух? Мой проект нацелен на .NET 2.0!Идентификация типа архитектуры процессора с использованием C#
ответ
Вы также можете попробовать (работает только если это не манипулировали):
System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
Возможно, вы можете задать вопрос пользователю?
Просто шучу, конечно ... Я думаю, что WMI - это то, что вы использовали бы для этого. Но может быть, есть и другой способ?
Если вы идете на WMI, то LinqToWmi может быть полезен. Я попробовал это один раз, и это показалось довольно прямым. =) ->http://www.codeplex.com/linq2wmi
Win32_Processor WMI Class выполнит эту работу. Используйте MgmtClassGen.exe для создания сильно типизированных оберток.
Это, вероятно, лучший ответ на вопрос. –
Это очень помогло мне! спасибо и +1! –
Как класс Win32_Processor должен помочь? если вы говорили об OSArchitecture, то это свойство недоступно в большинстве версий Windows, только поддержка нескольких последних версий. – ivan
Может this CodeProject статья может помочь? Он использует ManagementObjectSearcher в пространстве имен System.Management для поиска информации об оборудовании.
Я считаю, что вам следует избегать тяжелых наворотов, таких как 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/)
Спасибо за уже высказывая мысль У меня было (что вызвало стон), когда я прочитал предложение об использовании WMI. –
Ваша ссылка на intel.com теперь мертва. –
Вот что я сделал:
public static bool Isx86()
{
return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0);
}
Если вы используете 64-битную архитектуру, у вас будет две переменные env файла программы. Если вы на x86, у вас будет только один.
Ужасно, если все, о чем вы заботитесь, это 32bit vs 64 bit aka x86 vs x64, просто используйте следующее свойство BCL Environment.Is64BitOperatingSystem –
Это, кажется, самый простой для меня:
System.Environment.Is64BitOperatingSystem
доступно в .NET 4.0, в то время как вопрос о .NET 2.0 – ivan
Что привело меня сюда проверяет на 32 против 64-битных ОС. наивысший рейтинг отвечает за настройку для Текущий процесс. После того, как я не нашел ответа, я нашел следующую настройку. Надеюсь, что это работает для вас.
bool is64 = System.Environment.Is64BitOperatingSystem
Поддерживается только в .NET Framework 4+ –
Извините, что возродил старый поток, но как совет будущему читателю: поскольку 32-разрядный процесс может успешно работать в 64-битной ОС, 'System.Environment.Is64BitProcess' был более полезен в моем случае (установите' PATH' для «правильного» 'sqlite3.dll' на основе архитектуры). В моем случае ОС была действительно 64-битной, но из-за другой библиотеки мне пришлось скомпилировать мое приложение как 32-битное. – nurchi
Is64BitProcess не отображался, по крайней мере, до версии 4. Для любой версии, я думаю, что IntPtr.Size является самым элегантным решением; Я включил в код тройное выражение в коде, который привел меня на эту страницу. –
Вот кусок кода, который, кажется, работает (на основе 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 и выше.
Спасибо, что отлично работает ... Я ожидаю, что тип машины не тип ОС. –
Саймон, это, безусловно, самое скудное решение. Каждый, кто боится Платформы Invoke, преодолевает это; он не (обычно) кусается! –
Наконец самый короткий трюк, чтобы решить архитектуру платформы/процессор для текущей среды выполнения работает 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.
В зависимости от того, почему вы хотите знать, вы можете обнаружить, что проверка размера структуры IntPtr является самым простым способом.
Мне нравится, как думает Anonymous Coward! –
Я знаю, что этот вопрос из прошлого, но по состоянию на 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
Как насчет этого?
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:
еще не проверен.
- 1. C# - несоответствие архитектуры процессора
- 2. Обнаружение архитектуры процессора конкретного процесса в C#
- 3. Важность установки архитектуры архитектуры процессора в Visual Studio C#
- 4. Конфигурация архитектуры .NET CLR и архитектуры процессора
- 5. Android NDK и архитектуры процессора
- 6. System.Data архитектуры процессора установлен AMD64
- 7. Компилятор для настраиваемой архитектуры процессора
- 8. Ошибка процессора архитектуры несоответствие здания
- 9. Несоответствие архитектуры процессора для пешеходного перехода с использованием Cordova
- 10. Идентификация ASP.NET в архитектуре архитектуры, управляемой доменом
- 11. API и архитектуры процессора Android
- 12. Несоответствие архитектуры процессора SoundTouchNet DLL
- 13. Правильный способ определения архитектуры процессора?
- 14. Windows Mobile 6 архитектуры процессора?
- 15. Компилятор командной строки F #: настройка архитектуры процессора
- 16. Параллельное программирование с использованием архитектуры Haswell
- 17. 8-битный БПФ для архитектуры процессора?
- 18. Идентификация типа данных в памяти в C?
- 19. Несоответствие архитектуры процессора - Visual Studio, Nuget, Stylecop
- 20. понимание кэша процессора с использованием программы C
- 21. Идентификация типа ошибки WCF
- 22. Двойной (ы) через разные архитектуры процессора?
- 23. Изменение архитектуры процессора с помощью node-gyp configure
- 24. Определение архитектуры процессора статической библиотеки (LIB) в Windows
- 25. Идентификация типа объекта с помощью указателей в C++
- 26. Создание высокопроизводительного кода для любого процессора с использованием C# и C++/CLI
- 27. Идентификация закладок с использованием Python
- 28. Идентификация актера с использованием актераВыбор
- 29. Идентификация Android с использованием JSON
- 30. Идентификация палиндромов с использованием стеков
что делать, если он не установлен? –
Не задано для «манипулируемого» случая (по крайней мере, в Vista, оно установлено по умолчанию). Я предложил это альтернативным способом, не обязательно лучшим способом. –
хороший ответ. –