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 方式够用、稳定、文档丰富,适合大多数桌面应用的硬件信息采集需求。
