c#中获取电脑硬件信息最常用方式是通过system.management命名空间的managementobjectsearcher类,基于wmi查询,需引用system.management.dll,用wql语句如”select * from win32_processor”查询cpu、内存、硬盘等硬件信息,并注意异常处理与属性空值判断。

C# 中获取电脑硬件信息最常用的方式是通过 System.Management 命名空间中的 ManagementObjectSearcher 类,它基于 windows Management Instrumentation(WMI)查询系统信息。这种方式无需第三方库,兼容性好,适用于 Windows 平台。
基础用法:初始化并执行 WMI 查询
ManagementObjectSearcher 的核心是传入一个 WMI 查询语句(WQL),然后遍历返回的 ManagementObjectCollection 获取属性值。使用前需添加引用:System.Management.dll,并在代码顶部引入命名空间:
using System.Management;
典型结构如下:
- 构造
ManagementObjectSearcher实例,传入 WQL 查询字符串(如"SELECT * FROM Win32_Processor") - 调用
Get()方法获取结果集合 - 遍历每个
ManagementObject,用["PropertyName"]语法读取字段(如mo["Name"]) - 注意处理可能为
NULL的属性,避免运行时异常
常用硬件类与查询示例
WMI 提供多个预定义类,对应不同硬件组件:
- CPU:
Win32_Processor→ 获取型号、核心数、线程数、主频等
“SELECT Name, NumberOfCores, NumberOfLogicalProcessors, MaxClockSpeed FROM Win32_Processor” - 内存:
Win32_PhysicalMemory→ 获取单条内存容量、类型、速度
“SELECT Capacity, Speed, Manufacturer, PartNumber FROM Win32_PhysicalMemory” - 硬盘:
Win32_DiskDrive→ 获取型号、接口、总容量
“SELECT Model, InterfaceType, Size FROM Win32_DiskDrive” - 主板:
Win32_BaseBoard→ 获取制造商、型号、版本
“SELECT Manufacturer, Product, Version FROM Win32_BaseBoard” - 显卡:
Win32_VideoController→ 获取名称、显存(AdapterRAM)、驱动版本
“SELECT Name, AdapterRAM, DriverVersion FROM Win32_VideoController”
注意事项与健壮性建议
WMI 查询在某些环境(如精简版系统、权限受限账户、远程桌面会话)下可能失败或返回空结果:
- 务必用
try-catch包裹查询逻辑,捕获ManagementException和UnauthorizedAccessException - 属性值可能为
null或ManagementBaseObject类型(如嵌套对象),建议用mo["PropName"]?.ToString()或先判断mo["PropName"] != null - 部分数值(如内存容量、硬盘大小)以字节返回,需手动转为 GB/MB(除以
1024L * 1024 * 1024) - 若需高性能批量采集,避免频繁新建
ManagementObjectSearcher,可复用或考虑异步封装
替代方案简述
虽然 ManagementObjectSearcher 是主流选择,但也有其他方式:
- Windows.Devices.Enumeration(UWP):仅限 UWP 应用,API 更现代但权限限制多
- 第三方库如 OpenHardwareMonitorLib:支持传感器数据(温度、风扇转速),需额外引用和运行权限
- P/Invoke 调用 Win32 API:如
GetSystemInfo、GlobalMemoryStatusEx,轻量但覆盖范围有限
基本上就这些。WMI 方式够用、稳定、文档丰富,适合大多数桌面应用的硬件信息采集需求。