OpenHardwareMonitorLib是唯一可行选项,因其开源免安装、支持.NET Standard、直接访问硬件总线且不依赖WMI或厂商SDK,但需管理员权限运行并正确初始化。

不能直接读取 CPU 温度和风扇转速 —— Windows 系统本身不暴露这些传感器数据,C# 也没有内置 API;必须依赖第三方硬件监控库,而 OpenHardwareMonitorLib(注意不是 OpenHardwareLib)是目前唯一稳定、开源、免安装、支持 .NET Standard 的选择。
为什么 OpenHardwareMonitorLib 是唯一可行选项
市面上所谓 “OpenHardwareLib” 实际并不存在,常见混淆源于旧博客误写;真正可用的是 OpenHardwareMonitorLib.dll(来自 Open Hardware Monitor 项目)。它通过直接访问 SMBus/ISA 总线、ACPI 表和 MSR 寄存器获取传感器值,绕过了厂商驱动限制。
关键事实:
- 不依赖 WMI:
Win32_TemperatureProbe在绝大多数现代主板上返回空或无效值 - 不依赖厂商 SDK:无需安装 ASUS AI Suite、MSI Dragon Center 等臃肿软件
- 支持 .NET 5+ 和 .NET Framework 4.7.2+,但
net461是最低兼容版本 - 必须以管理员权限运行,否则多数传感器读数为 0 或 NaN
如何正确引用并初始化 OpenHardwareMonitorLib
不要用 NuGet 搜索 “OpenHardwareLib” —— 找不到;也不要从非官方源下载 DLL。正确做法是:
- 前往 GitHub Release 页面,下载最新版 ZIP(如
openhardwaremonitor-v0.9.6.zip) - 解压后,从
/OpenHardwareMonitor/目录提取OpenHardwareMonitorLib.dll(不是同名 EXE) - 在 Visual Studio 中右键项目 → “添加引用” → 浏览到该 DLL → 勾选“复制本地”设为
True - 代码中必须调用
computer.Open(),否则所有传感器均为 null
最小初始化示例:
using OpenHardwareMonitor.Hardware;
<p>var computer = new Computer
{
CPUEnabled = true,
GPUEnabled = false,
FanControllerEnabled = true,
MainboardEnabled = true
};
computer.Open(); // ⚠️ 这行漏掉就全为 0</p>
怎么安全读取 CPU 温度与风扇 RPM(带防崩溃处理)
传感器结构是树状嵌套:主硬件(CPU)→ 子传感器(温度、负载、风扇);且不同主板传感器命名、数量、索引位置完全不一致。硬写 hardware.Sensors[2].Value 必崩。
正确做法是遍历 + 类型 + 名称双重过滤:
- 温度传感器类型为
SensorType.Temperature,名称含"CPU"或"Core"(不是所有都叫 "CPU Package") - 风扇传感器类型为
SensorType.Fan,名称通常含"Fan"、"PWM"或具体接口名如"CPU_FAN" - 务必检查
sensor.Value.HasValue,未就绪时返回 null - 读取完建议调用
computer.Hardware[i].Update()刷新一次,否则值可能滞后
片段示例(仅取首个有效 CPU 温度和风扇):
foreach (var hardware in computer.Hardware)
{
hardware.Update();
foreach (var sensor in hardware.Sensors)
{
if (sensor.SensorType == SensorType.Temperature &&
(sensor.Name.Contains("CPU") || sensor.Name.Contains("Core")))
{
if (sensor.Value.HasValue)
Console.WriteLine($"CPU temp: {sensor.Value.Value:F1}°C");
}
else if (sensor.SensorType == SensorType.Fan &&
sensor.Name.Contains("Fan"))
{
if (sensor.Value.HasValue)
Console.WriteLine($"Fan RPM: {sensor.Value.Value:F0}");
}
}
}
常见报错与静默失败原因
程序没报错但输出全是 0 / NaN / null?大概率是以下之一:
-
Access is denied异常没捕获 → 确保以管理员身份运行(右键 exe → “以管理员身份运行”) - 主板不支持:部分 ITX 小板、OEM 品牌机(Dell/Lenovo 台式机)、AMD AM5 新平台暂无完整支持 → 查看
computer.Hardware是否为空数组 - BIOS 关闭了硬件监控:进入 BIOS,打开
HW Monitor、Q-Fan Control或Advanced → CPU Configuration → DTS/PECI等选项 - .NET 版本不匹配:若用 .NET 6+,需确认引用的 DLL 是从 v0.9.6+ 编译(旧版只支持 net461)
- 多线程并发读取:
computer.Open()和Update()非线程安全,避免多个 Task 同时调用
最易被忽略的一点:即使一切配置正确,首次读取前必须等待 1–2 秒 —— 传感器枚举和初始化不是即时完成的,立刻遍历往往拿到空值。











