.NET Framework 4.7开发的Windows Service频繁生成并删除同名.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

