☰
.NET 跨平台硬件信息库 Hardware.Info 深度指南
2026/10/24 11:55:07 网站建设 项目流程

在 .NET 开发中,读取计算机硬件信息(如 CPU 序列号、MAC 地址、内存状态、硬盘容量等)是实现软件授权(绑机)、系统监控、性能看板等功能的刚需。

然而,传统的ManagementObjectSearcher(WMI)不仅语法繁琐,而且完全不支持跨平台,一到 Linux 或 macOS 环境就会直接崩溃。今天为大家推荐一个优雅、强大的开源 .NET 类库——Hardware.Info。它不仅 API 极其简洁,而且统一了底层接口,原生支持Windows、Linux 和 macOS。

🛠️ 为什么选择 Hardware.Info?

  • 真·跨平台支持:完美适配 Windows (WMI)、Linux (/proc,/sys,lshw) 和 macOS (sysctl,system_profiler)。

  • 开箱即用:统一的面向对象 API,你不需要为不同的操作系统编写复杂的#if预处理指令。

  • 数据全面:覆盖 CPU、内存、网卡、硬盘、显卡、主板、电池、BIOS/固件等几乎所有核心硬件。

安装方式

添加 NuGet 包:

<ItemGroup><PackageReferenceInclude="Hardware.Info"Version="110.0.0.1"/></ItemGroup>

或者

<ItemGroup><PackageReferenceInclude="Hardware.Info.Aot"Version="110.0.0.1"/></ItemGroup>

💻 基础核心功能与标准代码实现

Hardware.Info的使用逻辑非常符合直觉:实例化对象→\rightarrow→刷新数据→\rightarrow→读取属性。

⚠️ 注意:在最新版本中,Drive(磁盘)类删除了原有的 Windows 专有属性InterfaceType(接口类型)以提升跨平台兼容性。以下是最新的标准实现代码:

// 1. 初始化硬件信息对象varhardwareInfo=newHardwareInfo();Console.WriteLine("正在读取系统硬件信息...\n"+newstring('-',40));// 2. 刷新所有硬件信息(也可以选择性刷新单项,如 hardwareInfo.RefreshCPU())hardwareInfo.RefreshAll();// ==================== 1. 操作系统信息 ====================Console.WriteLine($"[操作系统]:{hardwareInfo.OperatingSystem.Name}({hardwareInfo.OperatingSystem.VersionString})");// ==================== 2. CPU 信息 ====================Console.WriteLine("\n[CPU 信息]:");inttotalCores=0;stringcpuName="Apple Silicon";foreach(varcpuinhardwareInfo.CpuList){totalCores+=(int)cpu.NumberOfCores;if(!string.IsNullOrEmpty(cpu.Name))cpuName=cpu.Name;// 如果主频大于 0 则显示,否则说明是 M系列芯片,隐藏主频stringclockSpeedStr=cpu.CurrentClockSpeed>0?$"{cpu.CurrentClockSpeed}MHz":"动态调度 (系统接管)";stringmanufacturerStr=string.IsNullOrEmpty(cpu.Manufacturer)?"Apple Inc.":cpu.Manufacturer;Console.WriteLine($" - 架构分支:{cpu.Name}");Console.WriteLine($" * 核心数:{cpu.NumberOfCores}核");Console.WriteLine($" * 当前频率:{clockSpeedStr}");Console.WriteLine($" * 厂商:{manufacturerStr}");}Console.WriteLine($"\n 💡 [总结] 检测到{cpuName},总计物理核心:{totalCores}核 (混合架构)");// ==================== 3. 内存信息 ====================Console.WriteLine("\n[内存信息]:");doubletotalMemoryGB=hardwareInfo.MemoryStatus.TotalPhysical/(1024.0*1024.0*1024.0);doubleavailableMemoryGB=hardwareInfo.MemoryStatus.AvailablePhysical/(1024.0*1024.0*1024.0);Console.WriteLine($" - 总物理内存:{totalMemoryGB:F2}GB");// 💡 针对 macOS 的 0 GB 特殊处理if(availableMemoryGB<=0.01&&OperatingSystem.IsMacOS()){Console.WriteLine(" - 可用物理内存: 动态缓存中 (macOS 采用全缓存机制,请参考系统活动监视器)");Console.WriteLine(" - 内存状态提示: Apple Silicon 统一内存管理会最大化利用内存,0 GB 并不代表内存耗尽。");}else{Console.WriteLine($" - 可用物理内存:{availableMemoryGB:F2}GB");}// ==================== 4. 硬盘/存储信息 ====================Console.WriteLine("\n[硬盘列表]:");boolhasValidDrive=false;foreach(vardriveinhardwareInfo.DriveList){// 💡 过滤掉未识别出容量的虚拟盘或无权限盘if(drive.Size==0&&(drive.Model.Contains("Disk Image")||OperatingSystem.IsMacOS())){// 如果是 Mac 且容量为 0,我们可以选择展示名称,但说明权限限制doublesizeGB=drive.Size/(1024.0*1024.0*1024.0);stringserial=string.IsNullOrEmpty(drive.SerialNumber)?" [受系统安全限制已隐藏] ":drive.SerialNumber.Trim();Console.WriteLine($" - 磁盘名称:{drive.Caption}");Console.WriteLine($" * 型号:{drive.Model}");Console.WriteLine($" * 容量:{(sizeGB>0?$"{sizeGB:F2}GB":"系统沙盒限制,无法读取")}");Console.WriteLine($" * 序列号:{serial}");Console.WriteLine(" ----------------------------------------");continue;}// 正常 Windows 或能读出数据的磁盘doublevalidSizeGB=drive.Size/(1024.0*1024.0*1024.0);Console.WriteLine($" - 磁盘名称:{drive.Caption}(型号:{drive.Model})");Console.WriteLine($" * 容量:{validSizeGB:F2}GB");Console.WriteLine($" * 序列号:{drive.SerialNumber.Trim()}");hasValidDrive=true;}// ==================== 5. 显卡 (GPU) 信息 ====================Console.WriteLine("\n[显卡列表]:");foreach(vargpuinhardwareInfo.VideoControllerList){Console.WriteLine($" - 显卡名称:{gpu.Name}");// 💡 针对 macOS 的驱动版本做友好处理stringdriverVersionStr=string.IsNullOrEmpty(gpu.DriverVersion)&&OperatingSystem.IsMacOS()?"集成于 macOS 内核 (Metal 支持)":gpu.DriverVersion;Console.WriteLine($" * 图形驱动:{driverVersionStr}");Console.WriteLine($" * 当前分辨率:{gpu.CurrentHorizontalResolution}x{gpu.CurrentVerticalResolution}");}// ==================== 6. 网络适配器 (网卡) 信息 ====================Console.WriteLine("\n[网卡信息(仅列出活跃连接)]:");foreach(varnetinhardwareInfo.NetworkAdapterList){// 过滤掉未连接或虚拟网卡if(net.Speed>0&&!string.IsNullOrEmpty(net.MACAddress)){Console.WriteLine($" - 网卡名称:{net.Name}");Console.WriteLine($" - MAC 地址:{net.MACAddress}");Console.WriteLine($" - 速度:{net.Speed/1000000.0:F1}Mbps");}}// ==================== 7. 主板与 BIOS 信息 ====================Console.WriteLine("\n[主板与 BIOS]:");foreach(varboardinhardwareInfo.MotherboardList){// 如果是 Mac,内部识别码就是极好的设备指纹Console.WriteLine($" - 主板/设备型号:{board.Product}(厂商:{board.Manufacturer})");}foreach(varbiosinhardwareInfo.BiosList){// 💡 针对 Mac 固件概念进行名词转换stringfirmwareType=OperatingSystem.IsMacOS()?"iBoot (苹果引导固件)":"BIOS/UEFI 版本";stringreleaseDateStr=string.IsNullOrEmpty(bios.ReleaseDate)?"随 macOS 系统同步更新":bios.ReleaseDate;Console.WriteLine($" -{firmwareType}:{bios.Version}");Console.WriteLine($" - 固件发布日期:{releaseDateStr}");}

📊 各平台支持度与设备指纹(绑机)建议

基于上述实测,我们整理了Hardware.Info在三大平台上的表现矩阵:

硬件模块Windows 支持度Linux 支持度macOS (Apple Silicon) 支持度
CPU 型号/核心数🌟 完美🌟 完美👍 良好(大小核分段汇报)
内存状态🌟 完美🌟 完美⚠️ 较差(可用内存因缓存机制常显为0)
硬盘序列号/容量🌟 完美👍 良好(需 sudo)❌ 极差(受系统沙盒严格限制隐藏)
显卡与分辨率🌟 完美👍 良好👍 良好(驱动内嵌于系统内核)
主板与 BIOS🌟 完美👍 良好🌟 完美(精准识别出Mac16,12设备码与 iBoot)

💡 独立开发者做软件授权(设备指纹)的致命陷阱:

很多同学在 Windows 上调通后,习惯用CPU ID + 硬盘序列号算机器码。但如果你的软件要卖给 Mac 用户,这套逻辑必死无疑(因为在 Mac 上极大概率会读到一堆空字符串)。

  • 安全建议:在 macOS 平台,建议改用网卡 MAC 地址,或者直接读取主板信息中的board.Product(设备内部识别码,如Mac16,12)结合用户系统账户来生成指纹。

⚡ 性能优化高级技巧:按需刷新

在默认情况下,调用hardwareInfo.RefreshAll()会遍历系统所有底层驱动和 WMI 接口,会产生数百毫秒甚至1秒以上的阻塞延迟。

如果你的应用是在 UI 线程中运行,或者需要高频监控(如每秒刷新一次内存看板),请务必使用按需刷新:

// 极其轻量,适合做性能看板的定时器hardwareInfo.RefreshMemoryStatus();doublefreeGB=hardwareInfo.MemoryStatus.AvailablePhysical/(1024.0*1024.0*1024.0);// 仅在程序启动时执行一次即可hardwareInfo.RefreshMotherboardList();hardwareInfo.RefreshBiosList();
//hardwareInfo.RefreshOperatingSystem();//hardwareInfo.RefreshMemoryStatus();//hardwareInfo.RefreshBatteryList();//hardwareInfo.RefreshBIOSList();//hardwareInfo.RefreshComputerSystemList();//hardwareInfo.RefreshCPUList();//hardwareInfo.RefreshDriveList();//hardwareInfo.RefreshKeyboardList();//hardwareInfo.RefreshMemoryList();//hardwareInfo.RefreshMonitorList();//hardwareInfo.RefreshMotherboardList();//hardwareInfo.RefreshMouseList();//hardwareInfo.RefreshNetworkAdapterList();//hardwareInfo.RefreshPrinterList();//hardwareInfo.RefreshSoundDeviceList();//hardwareInfo.RefreshVideoControllerList();

📝 总结

Hardware.Info是目前 .NET 生态中少有的兼顾 API 简洁性与跨平台野心的硬件信息库。它摒弃了繁琐的底层命令调用,将其封装为纯粹的 C# 属性。虽然在 macOS 等对隐私限制极严的系统上存在部分数据“挂零”的现象,但只要我们在代码中做好跨平台容错,它依然是目前开发系统监控、运维工具或跨平台应用的利器。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询