using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Text; using System.Threading.Tasks; namespace AIK.Common.SysCommon { public static class MacAddressHelper { /// /// 获取主物理网卡的 MAC 地址(格式:00-1A-2B-3C-4D-5E) /// public static string GetPrimaryMacAddress() { try { var activeAdapters = NetworkInterface .GetAllNetworkInterfaces() .Where(nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType is NetworkInterfaceType.Ethernet or NetworkInterfaceType.Wireless80211 && !IsVirtualOrLoopback(nic)) .OrderByDescending(nic => nic.Speed) // 优先有线 > 无线 .ToList(); var primary = activeAdapters.FirstOrDefault() ?? NetworkInterface.GetAllNetworkInterfaces() .FirstOrDefault(nic => !IsVirtualOrLoopback(nic)); if (primary?.GetPhysicalAddress().GetAddressBytes().Length > 0 is true) { return FormatMacAddress(primary.GetPhysicalAddress().GetAddressBytes()); } return "未检测到有效物理网卡"; } catch (Exception ex) { return $"获取失败: {ex.Message}"; } } private static bool IsVirtualOrLoopback(NetworkInterface nic) { if (nic.NetworkInterfaceType == NetworkInterfaceType.Loopback) return true; string desc = nic.Description.ToLowerInvariant(); return desc.Contains("virtual") || desc.Contains("vmware") || desc.Contains("vbox") || desc.Contains("hyper-v") || desc.Contains("bluetooth") || desc.Contains("tunnel") || desc.Contains("isatap") || desc.Contains("6to4") || desc.Contains("teredo"); } private static string FormatMacAddress(ReadOnlySpan macBytes) { // 使用 Span 高效构建格式化字符串(.NET 8 推荐) var result = new StringBuilder(macBytes.Length * 3 - 1); for (int i = 0; i < macBytes.Length; i++) { if (i > 0) result.Append('-'); result.Append($"{macBytes[i]:X2}"); } return result.ToString(); } } }