直接告诉你答案:不能。 Windows 系统本身并不暴露 CPU 温度和风扇转速这些传感器数据,C# 也没有内置的 API 可以直接调用。想要读取这些硬件信息,必须依赖第三方硬件监控库。而在所有开源、免安装、支持 .NET Standard 的选项中,OpenHardwareMonitorLib(注意不是 OpenHardwareLib)是当下唯一稳定、可靠的选择。
为什么 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;
var computer = new Computer
{
CPUEnabled = true,
GPUEnabled = false,
FanControllerEnabled = true,
MainboardEnabled = true
};
computer.Open(); // ⚠️ 这行漏掉就全为 0
怎么安全读取 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 秒。传感器枚举和初始化不是即时完成的,立刻遍历往往拿到空值。