.NET 跨平台硬件信息库 Hardware.Info 深度指南
在 .NET 开发中读取计算机硬件信息如 CPU 序列号、MAC 地址、内存状态、硬盘容量等是实现软件授权绑机、系统监控、性能看板等功能的刚需。然而传统的ManagementObjectSearcherWMI不仅语法繁琐而且完全不支持跨平台一到 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 包ItemGroupPackageReferenceIncludeHardware.InfoVersion110.0.0.1//ItemGroup或者ItemGroupPackageReferenceIncludeHardware.Info.AotVersion110.0.0.1//ItemGroup 基础核心功能与标准代码实现Hardware.Info的使用逻辑非常符合直觉实例化对象→\rightarrow→刷新数据→\rightarrow→读取属性。⚠️ 注意在最新版本中Drive磁盘类删除了原有的 Windows 专有属性InterfaceType接口类型以提升跨平台兼容性。以下是最新的标准实现代码// 1. 初始化硬件信息对象varhardwareInfonewHardwareInfo();Console.WriteLine(正在读取系统硬件信息...\nnewstring(-,40));// 2. 刷新所有硬件信息也可以选择性刷新单项如 hardwareInfo.RefreshCPU()hardwareInfo.RefreshAll();// 1. 操作系统信息 Console.WriteLine($[操作系统]:{hardwareInfo.OperatingSystem.Name}({hardwareInfo.OperatingSystem.VersionString}));// 2. CPU 信息 Console.WriteLine(\n[CPU 信息]:);inttotalCores0;stringcpuNameApple Silicon;foreach(varcpuinhardwareInfo.CpuList){totalCores(int)cpu.NumberOfCores;if(!string.IsNullOrEmpty(cpu.Name))cpuNamecpu.Name;// 如果主频大于 0 则显示否则说明是 M系列芯片隐藏主频stringclockSpeedStrcpu.CurrentClockSpeed0?${cpu.CurrentClockSpeed}MHz:动态调度 (系统接管);stringmanufacturerStrstring.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[内存信息]:);doubletotalMemoryGBhardwareInfo.MemoryStatus.TotalPhysical/(1024.0*1024.0*1024.0);doubleavailableMemoryGBhardwareInfo.MemoryStatus.AvailablePhysical/(1024.0*1024.0*1024.0);Console.WriteLine($ - 总物理内存:{totalMemoryGB:F2}GB);// 针对 macOS 的 0 GB 特殊处理if(availableMemoryGB0.01OperatingSystem.IsMacOS()){Console.WriteLine( - 可用物理内存: 动态缓存中 (macOS 采用全缓存机制请参考系统活动监视器));Console.WriteLine( - 内存状态提示: Apple Silicon 统一内存管理会最大化利用内存0 GB 并不代表内存耗尽。);}else{Console.WriteLine($ - 可用物理内存:{availableMemoryGB:F2}GB);}// 4. 硬盘/存储信息 Console.WriteLine(\n[硬盘列表]:);boolhasValidDrivefalse;foreach(vardriveinhardwareInfo.DriveList){// 过滤掉未识别出容量的虚拟盘或无权限盘if(drive.Size0(drive.Model.Contains(Disk Image)||OperatingSystem.IsMacOS())){// 如果是 Mac 且容量为 0我们可以选择展示名称但说明权限限制doublesizeGBdrive.Size/(1024.0*1024.0*1024.0);stringserialstring.IsNullOrEmpty(drive.SerialNumber)? [受系统安全限制已隐藏] :drive.SerialNumber.Trim();Console.WriteLine($ - 磁盘名称:{drive.Caption});Console.WriteLine($ * 型号:{drive.Model});Console.WriteLine($ * 容量:{(sizeGB0?${sizeGB:F2}GB:系统沙盒限制无法读取)});Console.WriteLine($ * 序列号:{serial});Console.WriteLine( ----------------------------------------);continue;}// 正常 Windows 或能读出数据的磁盘doublevalidSizeGBdrive.Size/(1024.0*1024.0*1024.0);Console.WriteLine($ - 磁盘名称:{drive.Caption}(型号:{drive.Model}));Console.WriteLine($ * 容量:{validSizeGB:F2}GB);Console.WriteLine($ * 序列号:{drive.SerialNumber.Trim()});hasValidDrivetrue;}// 5. 显卡 (GPU) 信息 Console.WriteLine(\n[显卡列表]:);foreach(vargpuinhardwareInfo.VideoControllerList){Console.WriteLine($ - 显卡名称:{gpu.Name});// 针对 macOS 的驱动版本做友好处理stringdriverVersionStrstring.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.Speed0!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 固件概念进行名词转换stringfirmwareTypeOperatingSystem.IsMacOS()?iBoot (苹果引导固件):BIOS/UEFI 版本;stringreleaseDateStrstring.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();doublefreeGBhardwareInfo.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 等对隐私限制极严的系统上存在部分数据“挂零”的现象但只要我们在代码中做好跨平台容错它依然是目前开发系统监控、运维工具或跨平台应用的利器。