c# 无法直接读取主板温度,因其运行在 .net 运行时上,缺乏访问硬件传感器的底层接口;需依赖 openhardwaremonitorlib 等外部库,以管理员权限调用驱动获取数据。

为什么 C# 本身不能直接读取主板温度
C# 运行在 .NET 运行时上,不提供访问硬件传感器的底层接口。Windows 本身也不向普通应用开放 HWMonitor 或 Open Hardware Monitor 那类数据——这些工具靠的是驱动级权限(如 WMI 的 MSAcpi_ThermalZoneTemperature 类,或直接读取 SMBIOS/ACPI 表),而 .NET 默认没这能力。
所以你看到的“C# 读温度”方案,本质都是调用外部库或系统接口的封装,不是语言原生支持。
用 OpenHardwareMonitorLib.dll 是最可行的方案
这是目前最稳定、更新活跃、支持主流主板芯片组(IT87xx、NCT67xx、AMD SMU、Intel RAPL)的开源库。它通过内核驱动 OpenHardwareMonitor.sys(需管理员权限加载)获取原始传感器数据。
- 必须以管理员权限运行你的 C# 程序,否则
Computer.CPU和Computer.Mainboard会为空 - 下载后只引用
OpenHardwareMonitorLib.dll即可,不需要安装服务或注册表操作 - 初始化后要调用
computer.Hardware[0].Update()才能刷新值,不是自动轮询 - 温度单位是毫开尔文(mK),得除以 1000 转成 ℃:比如
sensor.Value / 1000.0
var computer = new Computer { CPUEnabled = true, MainboardEnabled = true };
computer.Open();
computer.Hardware.First().Update(); // 必须手动触发
foreach (var sensor in computer.Hardware[0].Sensors)
if (sensor.SensorType == SensorType.Temperature)
Console.WriteLine($"{sensor.Name}: {sensor.Value / 1000.0}°C");
WMI 方式基本不可靠,慎用
网上常见用 Win32_TemperatureProbe 或 MSAcpi_ThermalZoneTemperature 的例子,但实际多数主板 BIOS 不实现这些 WMI 类,返回空结果或 0 值。即使有数据,也常是封装后的“安全温度”,非真实传感器读数。
-
Win32_TemperatureProbe在 Windows 10/11 上几乎全失效,微软已标记为“deprecated” -
MSAcpi_ThermalZoneTemperature依赖 ACPI 表完整性和驱动支持,Surface、MacBook(Boot Camp)、部分 OEM 笔记本根本没暴露 - 查询 WMI 不需要管理员权限,但换来的是“查得到却不准”或“查不到就报错”
别碰 WinRing0、RDMSR 这类底层操作
有人试图用 WinRing0.sys + ReadMsr 直接读取 Intel MSR 寄存器(如 IA32_TEMPERATURE_TARGET),但这属于高危操作:
- Windows 10 1903+ 默认禁止未签名驱动加载,
WinRing0.sys很难启用 - 读错 MSR 地址可能蓝屏;不同 CPU 架构(Ryzen vs Core i7)寄存器定义完全不同
- 主板厂商不保证公开所有温度传感器地址,很多关键点(如 PCH 温度)根本不在 CPU MSR 里
除非你在写专用诊断工具且控制全部硬件型号,否则纯属给自己埋雷。
真正难点不在代码怎么写,而在你手头那块主板是否被 OpenHardwareMonitor 支持——建议先跑一遍它的官方 GUI 版,确认能识别温度传感器,再动手写 C# 封装。不支持的板子,换库也没用。











