You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Framework 4.7开发的Windows Service频繁生成并删除同名.sys文件求助

解决Windows服务频繁生成同名.sys文件的问题

我之前也碰到过一模一样的情况!这事儿十有八九是你用的OpenHardwareMonitor库导致的,给你拆解下原因和解决办法:

问题根源

OpenHardwareMonitor为了读取底层硬件传感器(比如CPU温度、使用率)的数据,需要加载内核驱动程序。它的默认逻辑是:每次采集硬件信息时,会动态生成一个和你的服务EXE同名的.sys驱动文件,加载完成后立即删除这个文件——这就是你看到“频繁生成又删除”现象的原因。之前你没遇到过,是因为其他服务没用到需要内核驱动的硬件采集库。

具体解决办法

1. 升级/替换硬件采集库

优先试试这个方案:

  • OpenHardwareMonitor已经很久没维护了,建议换成它的活跃分支LibreHardwareMonitor(功能完全一致,修复了很多旧bug,包括驱动加载的频繁创建文件问题)。
  • 如果不需要太深入的硬件数据,也可以改用.NET自带的System.Management类库,它不需要额外驱动,直接通过WMI读取硬件信息,虽然细节少一点,但足够满足CPU使用率这类基础采集需求。

2. 优化采集逻辑,减少驱动加载次数

看你的代码,Timer每秒触发一次si.GetSystemInfo(),而且每次都新建SystemInfo实例——这会导致每次采集都触发一次驱动的加载/卸载。可以把SystemInfo的实例初始化放到服务启动时,复用同一个实例:

修改你的Service.cs代码:

Timer timer = null;
SystemInfo si = null; // 提前声明全局实例

public Service() {
    InitializeComponent();
    timer = new Timer(1000);
    timer.Elapsed += Timer_Elapsed;
    si = new SystemInfo(); // 服务初始化时就创建实例
}

private void Timer_Elapsed(object sender, ElapsedEventArgs e) {
    si.GetSystemInfo(); // 复用实例,不用每次新建
}

这样驱动只会在实例初始化时加载一次,后续采集不会重复生成.sys文件。

3. 手动部署驱动文件

如果坚持用OpenHardwareMonitor,可以手动把它的驱动文件(一般是OpenHardwareMonitor.sys,或者和你EXE同名的.sys)部署到系统驱动目录:

  • 把驱动文件复制到C:\Windows\System32\drivers
  • 用管理员权限执行命令注册驱动:
    sc create OHMDriver type= kernel binPath= "C:\Windows\System32\drivers\OpenHardwareMonitor.sys"
    
  • 启动服务前先启动这个驱动:sc start OHMDriver

这样服务运行时就不会频繁生成删除驱动文件了,不过要注意:Windows 10及以上版本要求驱动有数字签名,否则可能加载失败,生产环境不建议关闭驱动签名验证。

额外提醒

如果是通过NuGet安装的OpenHardwareMonitor,记得检查包的版本,有些旧版本的驱动加载逻辑确实存在频繁创建文件的问题,升级到最后一个稳定版(v0.9.6)可能会缓解这个问题。

内容的提问来源于stack exchange,提问作者mdowes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:39:38